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().

  1. Вы используете цикл по умолчанию, попробуйте метод @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; ?>

Ссылка ссылки: Нажмите меня