Wordpress: настраиваемый цикл для исключения почтового идентификатора, назначенного в виджетах $args
Наличие виджета, зарегистрированного в function.php
для отображения определенной метатеги post_id:
class featured_widget extends WP_Widget
{
/**
* Display front-end contents.
*/
function widget($args, $instance)
{
$post = get_post($instance['post_id']);
...
}
}
Я хочу исключить назначенный post_id
из $post
из моего цикла:
if (have_posts()) : while (have_posts()) : the_post();
Ответы
Ответ 1
1. Как получить значение post_id
?
WordPress хранит данные виджетов в таблице опций с option_name
is widget_{$id_base}
. Пример, когда вы создаете виджет, подобный этому:
function __construct() {
parent::__construct('so37244516-widget',
__('A label', 'text-domain'), [
'classname' => 'so37244516-widget-class',
'description' => __('Some descriptions', 'text-domain')
]);
}
option_name
должен быть widget_so37244516-widget
. Затем, чтобы получить данные виджета, нам просто нужно использовать:
$data = get_option('widget_so37244516-widget');
Но поскольку виджет может иметь несколько экземпляров, $data
является ассоциативным массивом с непредсказуемыми ключами. (Каждый раз, когда мы перетаскиваем виджет на боковую панель и сохраняем его, возвращается новый экземпляр виджета).
Итак, если на вашем сайте есть только один экземпляр виджета, $data[2]['post_id']
- это значение, которое нам нужно. И если есть несколько экземпляров, нам нужно пройти через $data
, сравнить некоторые ключи и значения, чтобы найти правильный. Как всегда, var_dump($data)
очень полезен.
2. Исключить пост post_id
из цикла.
Предположим, что $exclude_id
- это значение, полученное на шаге 1.
- Вы выполняете настраиваемый цикл, используйте метод @hemnath_mouli:
$query = new WP_Query([
'post__not_in' => [$exclude_id]
]);
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post();
// Do loop.
endwhile;
wp_reset_query(); // Must have.
else :
// Do something.
endif;
Не забудьте сделать wp_reset_query()
.
- Вы используете цикл по умолчанию, попробуйте метод @Deepti_chipdey в
functions.php
:
add_action('pre_get_posts', function($query)
{
if ( $query->is_home() && $query->is_main_query() ) {
$query->set('post__not_in', [$exclude_id]);
}
});
Обязательно измените is_home()
на свою страницу предпочтений.
Ответ 2
Если вы хотите исключить сообщение, вы должны использовать post__not_in
в WP_Query
$post = new WP_Query( array( 'post__not_in' => array( $exclude_ids ) ) );
Надеюсь, это поможет вам.!
Ответ 3
Вам нужно использовать pre get posts hook.
Tyr этот код
function exclude_single_posts_home($query) {
if ($query->is_home() && $query->is_main_query()) {
$query->set('post__not_in', array($post));
}
}
add_action('pre_get_posts', 'exclude_single_posts_home');
Ответ 4
Если вы хотите исключить одно сообщение, выполните действия, указанные выше.
Но если вы не укажете идентификатор сообщения отдельно, просто сделайте все сообщение, которое вы хотите исключить в категорию, и исключите его простым способом.
Исключить сообщения из определенной категории
<?php $query = new WP_Query( 'cat=-3,-8' ); ?>// 3 and 8 are category id
Подробный пример
<?php $query = new WP_Query( 'cat=-3,-8' ); ?>
<?php if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>
<div class="post">
<!-- Display the Title as a link to the Post permalink. -->
<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<!-- Display the date (November 16th, 2009 format) and a link to other posts by this posts author. -->
<small><?php the_time( 'F jS, Y' ); ?> by <?php the_author_posts_link(); ?></small>
<div class="entry">
<?php the_content(); ?>
</div>
<p class="postmetadata"><?php _e( 'Posted in' ); ?> <?php the_category( ', ' ); ?></p>
</div> <!-- closes the first div box -->
<?php endwhile;
wp_reset_postdata();
else : ?>
<p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>
Ссылка ссылки: Нажмите меня