Bài tiêm - làm thế nào để loại trừ bài gốc


7

Câu hỏi này đề cập đến công việc mở rộng của @Pieter Goosen về cách thay đổi truy vấn chính bằng cách sử dụng pre_get_postshook trên các trang thật. Nó cũng được tham chiếu trong codex .

Với phương pháp của mình, bạn có thể đưa các bài đăng được chỉ định vào trang của mình mà không cần phải chạm vào tệp mẫu. Điều này mang lại nhiều lựa chọn phát triển.

Cho đến bây giờ phương thức của anh ta sử dụng CSS để ẩn đối tượng bài đăng mà vòng lặp tiêu chuẩn xuất ra cho trang được hiển thị. Có hai móc hành động loop_startloop_endđược sử dụng để tạo một thùng chứa ẩn xung quanh đối tượng bài. Sẽ thật tuyệt nếu có thể loại trừ hoàn toàn đối tượng bài đăng của trang.

Tôi đã cố gắng kết nối pre_get_postsvới một cái gì đó như $query->set('post__not_in', get_the_ID();tại loop_startnhưng điều này đã không làm việc. Tôi đang thiếu các kỹ năng cần thiết để hoàn thiện việc này.

Bạn có thể giúp? Hãy nhớ rằng chúng tôi không muốn chạm vào các tập tin mẫu. Cảm ơn trước.


Đây là cùng một vấn đề tôi gặp phải khi tôi viết mã trong câu trả lời được liên kết. Thật không may, tôi đã không tìm ra một giải pháp tốt hơn là ẩn trang bằng CSS. Vấn đề lớn là, nếu bạn cần giữ tính toàn vẹn của trang để sử dụng trong mẩu bánh mì, v.v., bạn cần để truy vấn chính chạy khóa học của nó. Sẽ thật tốt nếu ai đó có thể đưa ra một cách tiếp cận khác. Thật không may, tôi thực sự bị ràng buộc với các dự án khác, vì vậy tôi không có thời gian để viết mã hoặc chơi với các tình huống có thể xảy ra. Tôi hy vọng bạn giải quyết được vấn đề này, nó sẽ không chỉ hữu ích cho bản thân bạn, mà còn cho nhiều người khác ngoài kia
Pieter Goosen

Tôi sẽ tiếp tục cố gắng và đồng ý điều này nên được coi là có liên quan. Chúc may mắn và cảm ơn vì đã đáp ứng điều này.
matjaeck

1
Vì vậy, bạn đang cố gắng có một trang, nói "/ page /" và bạn muốn thay đổi truy vấn chính để thay vào đó hiển thị một số bài đăng ... điều đó có đúng không ?? mục tiêu cuối cùng mong muốn của bạn là gì?
Caleb

Câu trả lời:


1

tôi nghĩ pre_get_posts nên làm việc với $query->set(). Chỉ có vấn đề tôi thấy có bạn đang sử dụng get_the_ID()trong một cái móc. Hãy thử sử dụng $postbiến toàn cục để có được id bài hiện tại.


0

Đây là một cách hack đơn giản có thể giúp bạn đạt được bất cứ điều gì bạn đang cố gắng thực hiện -: Cảnh báo: Điều này chỉ được thử nghiệm trên các chủ đề mười hai và hai mươi năm để nó có thể hoạt động với chủ đề hiện tại của bạn.

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

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.