Wordpress:自定义循环,以排除小部件$ args中分配的帖子ID

时间:2016-05-15 22:48:59

标签: php wordpress

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

4 个答案:

答案 0 :(得分:11)

1。如何获得post_id值?

WordPress将小部件数据存储在选项表中,option_namewidget_{$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步获得的值。

  1. 你正在做一个自定义循环,使用@ hemnath_mouli的方法:
  2. $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. 您正在使用默认循环,请在functions.php中尝试@ Deepti_chipdey的方法:
    2. add_action('pre_get_posts', function($query)
      {
          if ( $query->is_home() && $query->is_main_query() ) {
              $query->set('post__not_in', [$exclude_id]);
          }
      });
      

      务必将is_home()更改为首选项页。

答案 1 :(得分:1)

如果您想要覆盖帖子,则必须使用WP_Query中的post__not_in

$post = new WP_Query( array( 'post__not_in' => array( $exclude_ids ) ) );

希望这会对你有帮助。!

答案 2 :(得分:1)

你需要使用pre get posts hook。

发送此代码

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');

答案 3 :(得分:0)

如果您要排除单个帖子,请按照上述步骤进行操作

但除非您单独发布帖子ID,否则只需将您要排除的所有帖子排除在某个类别中,并以简单的方式将其排除。

从某些类别中排除帖子

    <?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's 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; ?>

参考链接:Click me