Nach der Injektion - So schließen Sie den ursprünglichen Beitrag aus

7

Diese Frage bezieht sich auf @Pieter Goosens umfangreiche Arbeit zum Ändern der Hauptabfrage mithilfe des Hooks pre_get_postsauf echten Seiten. Es wird auch im Kodex verwiesen .

Mit seiner Methode können Sie bestimmte Beiträge in Ihre Seite einfügen, ohne die Vorlagendatei selbst berühren zu müssen. Dies bietet zahlreiche Entwicklungsmöglichkeiten.

Bisher verwendet seine Methode CSS, um das Post-Objekt auszublenden, das die Standardschleife für die angezeigte Seite ausgibt. Es gibt zwei Aktions-Hooks, loop_startmit loop_enddenen ein versteckter Container um das Post-Objekt erstellt wird. Es wäre großartig, wenn es möglich wäre, das Post-Objekt der Seite vollständig auszuschließen.

Ich habe versucht, mich pre_get_postsmit so etwas wie $query->set('post__not_in', get_the_ID();at zu beschäftigen, loop_startaber das hat nicht funktioniert. Mir fehlen die Fähigkeiten, um den letzten Schliff zu geben.

Kannst du helfen? Denken Sie daran, dass wir die Vorlagendateien nicht berühren möchten. Danke im Voraus.

matjaeck
quelle
Dies ist das gleiche Problem, mit dem ich konfrontiert war, als ich den Code in die verknüpfte Antwort schrieb. Leider habe ich keine bessere Lösung gefunden, als die Seite mit CSS auszublenden. Das große Problem ist, wenn Sie die Seitenintegrität für die Verwendung in Breadcrumbs usw. beibehalten möchten, müssen Sie die Hauptabfrage laufen lassen. Es wäre schön, wenn jemand einen anderen Ansatz dafür finden könnte. Leider bin ich sehr mit anderen Projekten verbunden, so dass ich keine Zeit habe, mögliche Szenarien zu programmieren oder damit zu spielen. Ich hoffe, Sie haben das gelöst, es wird nicht nur für Sie selbst nützlich sein, sondern auch für viele andere da draußen
Pieter Goosen
Ich werde es weiter versuchen und zustimmen, dass dies als relevant angesehen werden sollte. Viel Glück und vielen Dank für die Antwort.
Matjaeck
1
Sie versuchen also, eine Seite zu haben, sagen Sie "/ page /", und Sie möchten die Hauptabfrage ändern, um stattdessen einige Beiträge anzuzeigen ... ist das richtig? Was ist Ihr gewünschtes Endziel?
Caleb

Antworten:

1

Ich denke pre_get_postssollte damit arbeiten $query->set(). Das einzige Problem, das ich dort sehe, ist, dass Sie es get_the_ID()in einem Haken verwenden. Versuchen Sie, eine globale $postVariable zu verwenden, um die aktuelle Post-ID abzurufen.

Aniruddha Gawade
quelle
0

Hier ist ein einfacher Hack, der Ihnen dabei helfen kann, das zu erreichen, was Sie versuchen -: Warnung: Dies wird nur an sechsundzwanzig und siebenundzwanzig Themen getestet, sodass es möglicherweise mit Ihrem aktuellen Thema funktioniert oder nicht.

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
quelle