Post injection - как исключить исходный пост

Этот вопрос относится к обширной работе о том, как изменить основной запрос с помощью ---- +: = 0 =: + ---- привязать истинные страницы. Он также упоминается в codex .

С помощью своего метода вы можете вводить указанные сообщения на свою страницу без необходимости касаться самого файла шаблона. Это дает множество вариантов разработки.

До сих пор его метод использовал CSS, чтобы скрыть объект post, который выдает стандартный цикл для отображаемой страницы. Есть два крючка действий, pre_get_posts и loop_start, которые используются для создания скрытого контейнера вокруг объекта post. Было бы замечательно, если бы можно было полностью исключить объект post страницы.

Я попытался подключиться к loop_end с чем-то вроде pre_get_posts в $query->set('post__not_in', get_the_ID();, но это не сработало. Мне не хватает навыков, необходимых для того, чтобы покончить с этим.

Вы можете помочь? Помните, что мы не хотим прикасаться к файлам шаблонов. Спасибо заранее.

7 голосов | спросил Jekyll 16 Maypm16 2016, 23:01:10

2 ответа


1

Я думаю, что pre_get_posts должен работать с $query->set(). Единственная проблема, я вижу, что вы используете get_the_ID() в hook. Попробуйте использовать глобальную переменную $post, чтобы получить текущий идентификатор сообщения.

ответил Aniruddha Gawade 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 10 Sep 2016 16:25:29 +0300 2016, 16:25:29
0

Вот простой взлом, который может помочь вам достичь того, что вы пытаетесь сделать: Предупреждение. Это проверяется только на двадцатисекундные и двадцать семнадцать тем, чтобы они могли или не могли работать с вашей текущей темой.

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

}

ответил Irene Mitchell 25 MarpmSat, 25 Mar 2017 16:29:20 +03002017-03-25T16:29:20+03:0004 2017, 16:29:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132