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

10 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']);
...
}
Run Code Online (Sandbox Code Playgroud)

}

我想从我的循环中排除已分配post_id的内容$post:

if (have_posts()) : while (have_posts()) : the_post();
Run Code Online (Sandbox Code Playgroud)

Min*_*Tri 11

1.如何获得post_id价值?

WordPress使用option_nameis 将小部件数据存储在选项表中widget_{$id_base}.例如,当您构建这样的小部件时:

function __construct() {
    parent::__construct('so37244516-widget',
        __('A label', 'text-domain'), [
        'classname'   => 'so37244516-widget-class',
        'description' => __('Some descriptions', 'text-domain')
    ]);
}
Run Code Online (Sandbox Code Playgroud)

option_name应该是widget_so37244516-widget.然后要检索小部件数据,我们只需要使用:

$data = get_option('widget_so37244516-widget');
Run Code Online (Sandbox Code Playgroud)

但是,因为窗口小部件可以有多个实例,所以$data是具有不可预测键的关联数组.(每次我们将窗口小部件拖动到侧边栏并保存它时,都会返回窗口小部件的新实例).

因此,如果您的网站中只有一个小部件实例,那么$data[2]['post_id']我们需要的是价值.如果有多个实例,我们需要循环$data,比较一些键和值以找出正确的实例.一如既往,var_dump($data)非常有帮助.

2. post_id从循环中排除帖子.

假设$exclude_id是我们从第1步获得的值.

  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;
Run Code Online (Sandbox Code Playgroud)

记得要做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]);
    }
});
Run Code Online (Sandbox Code Playgroud)

请务必更改is_home()为您的首选项页面.


hem*_*uli 1

如果你想排除一个帖子,那么你必须post__not_inWP_Query中使用

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

希望这会帮助你。