POST注入-如何排除原始POST

时间:2016-05-16 作者:matjaeck

这个问题是指@Pieter Goosen\'sextensive work 关于如何使用pre_get_posts 钩住真实页面。在codex.

使用他的方法,您可以在页面中插入指定的帖子,而不必接触模板文件本身。这提供了许多开发选项。

到目前为止,他的方法使用CSS隐藏标准循环为显示的页面输出的post对象。有两个动作挂钩,loop_startloop_end 用于在post对象周围创建隐藏容器。如果可以完全排除页面的post对象,那就太好了。

我试图勾搭上pre_get_posts 比如$query->set(\'post__not_in\', get_the_ID();loop_start 但这不起作用。我缺乏完成这件事所需的技能。

你能帮忙吗?记住,我们不想接触模板文件。提前谢谢。

2 个回复
SO网友:Aniruddha Gawade

我想pre_get_posts 应与配合使用$query->set().我看到的唯一问题是你正在使用get_the_ID() 在钩子里。尝试使用全局$post 变量以获取当前帖子id。

SO网友:Irene Mitchell

这里有一个简单的技巧,可以帮助你实现你想做的任何事情:警告:这只在2616和217个主题上测试,所以它可能对你当前的主题有用,也可能对你当前的主题无效。

class VirtualPage {
/**
 * @var int $page_id    The ID of the page where you would want to inject your custom template.
 **/
var $page_id = 0;

/**
 * @var (mixed) $callback   The callback function/method that will be called to replace the current post.
 **/
var $callback = false;

function __construct( $page_id, $callback = false ) {
    $this->page_id = $page_id;
    $this->callback = $callback;

    /**
     * Set the injector when there are posts found.
     **/
    add_action( \'posts_results\', array( $this, \'posts_results\' ), 10, 2 );
}

function posts_results( $posts, $wp ) {

    if ( $wp->is_main_query()
        && $wp->is_singular
        && count( $posts ) > 0
        && $posts[0]->ID == $this->page_id ) {

        $found_posts = count( $posts );

        /**
         * $wp->post_count holds the number of iterated posts. We\'ll make WP believe that all
         * posts are iterated.
         **/
        $wp->post_count = $found_posts;

        /**
         * $wp->current_post holds the current post index. Setting it to the last post index
         * will immediately trigger `loop_end` action hook.
         **/
        $wp->current_post = $found_posts - 1;

        add_action( \'loop_end\', array( $this, \'loop_end\' ) );

        /**
         * Immediately remove the hook!
         **/
        remove_action( \'posts_results\', array( $this, \'posts_results\' ), 10, 2 );
    }

    return $posts;
}

function loop_end() {
    if ( $this->callback ) {
        // Call your callback here or do your stuff here
        call_user_func( $this->callback );
    }

    /**
     * Immediately remove the hook!
     **/
    remove_action( \'loop_end\', array( $this, \'loop_end\' ) );
}
}

相关推荐