Verwenden Sie pre_get_posts, um eine Schleife in einem multiloop-Archiv zu filtern

Ich habe ein benutzerdefiniertes Post-Archiv (archive-rg_blog.php) mit zwei Schleifen darin. Eine der Schleifen, die ich mit dem folgenden Code filtern möchte. Es ist nur eine einfache Schleife für alle Posts, und ich muss sie nur so einstellen, dass sie alle Posts zurückgibt, anstatt die benutzerdefinierten Posts, die sie standardmäßig zurückgeben würde.

Die andere Schleife muss den Titel und den Inhalt eines bestimmten benutzerdefinierten Posts abrufen. Das Folgende scheint auch die zweite Schleife zu filtern, so dass es überhaupt nichts zurückgibt.

function blog_filter($query) { if ( !is_admin() && $query->is_main_query() ) { if ($query->is_post_type_archive('rg_blog')) { $query->set('post_type', 'post'); } } } add_action('pre_get_posts','blog_filter'); 

Und das ist die Schleife, die nichts zurückgibt:

 post_title;?> 

Edit: Nur um zu verdeutlichen, das ist es was ich versuche zu tun.

 ///loop 1, queries a specific post ///loop 2, a normal loop filtered with pre_get_posts, which should return all posts. ///loop 3, also queries a specific post 

Also muss ich den Filter vor Schleife 2 hinzufügen und vor der Schleife 3 wieder entfernen. Ich habe versucht, den Filter in die Archivvorlage an der entsprechenden Stelle einzufügen, aber Schleife 2 kann dann nicht alle Beiträge zurückgeben.

Edit # 2: Hier ist die ganze Schleife in Aktion. Es ist die ZWEITE Schleife, die gefiltert werden muss.

  post_title;?> 

is_main_query()) { if ($query->is_post_type_archive('rg_blog')) { $query->set('post_type', 'post'); } } } add_action('pre_get_posts','blog_filter');?> post_title;?>

post_content;?>

Solutions Collecting From Web of "Verwenden Sie pre_get_posts, um eine Schleife in einem multiloop-Archiv zu filtern"

Fügen Sie den Filter dort hinzu, wo Sie ihn brauchen, und entfernen Sie ihn anschließend .

 add_action('pre_get_posts','blog_filter'); // your query; presumably WP_Query // your first loop remove_action('pre_get_posts','blog_filter'); // another query; presumably WP_Query // your second loop 

Sie können Ihre Aktion auch selbst entfernen:

 function blog_filter($query) { remove_action('pre_get_posts','blog_filter'); if ( !is_admin() && $query->is_main_query() ) { if ($query->is_post_type_archive('rg_blog')) { $query->set('post_type', 'post'); } } } add_action('pre_get_posts','blog_filter'); 

Ihr Code, neu organisiert:

 // define the function; can be here or functions.php function blog_filter($query) { if ( !is_admin() && $query->is_main_query()) { if ($query->is_post_type_archive('rg_blog')) { $query->set('post_type', 'post'); } } } get_header(); // blog title and description query $post_id = 4606; // add the filter add_action('pre_get_posts','blog_filter'); $queried_post = get_post($post_id); // remove the filter; the query is done remove_action('pre_get_posts','blog_filter'); $title = $queried_post->post_title; ?> 

< ?php echo $title;?>

< ?php // Main Loop (All Posts) $post = $posts[0]; $c=0; if (have_posts()) { while (have_posts()) { the_post(); // Featured Post $c++; if( !$paged && $c == 1) { // stuff // Other Posts } else { // the remaining posts } } } // The end of the loop // third loop, a repeat of loop 1 // blog title and description query $post_id = 4606; $queried_post = get_post($post_id); $title = $queried_post->post_title; ?>

< ?php echo $title;?>

< ?php echo $queried_post->post_content; get_footer();

Ich habe das nicht getestet, aber ich denke, es wird besser funktionieren. Hoffentlich habe ich keine Syntaxerrors.

Bearbeiten:

Ich habe mir deinen Code genauer angeschaut (ohne “Defiance” zu sehen) und bemerke ein paar Dinge.

  1. Ihr Filter wirkt sich nur auf die Hauptabfrage aus, daher müssen Sie sie hinzufügen, bevor die Seitenvorlage geladen wird – wahrscheinlich in der Datei functions.php . Aber mein Verständnis der Frage ist, dass der Filter für eine sekundäre Schleife bestimmt ist. Das würde bedeuten, dass diese “Hauptabfrage” falsch ist.
  2. Sie fordern Beiträge über get_post nach ID an, für die der Filter also irrelevant ist.

Um diese Hauptabfrage zu filtern, benötigen Sie diese in functions.php :

 // define the function; can be here or functions.php function blog_filter($query) { // remove the filter; the query is done remove_action('pre_get_posts','blog_filter'); if ( !is_admin() && $query->is_main_query()) { if ($query->is_post_type_archive('rg_blog')) { $query->set('post_type', 'book'); } } } add_action('pre_get_posts','blog_filter'); 

Und keine anderen Aktionen hinzufügen oder entfernen. Ich bin mir nicht sicher, ob du das willst. Die beiden get_post Aufrufe sollten nicht betroffen sein.

Ich würde vorschlagen, das is_post_type_archive vor dem Hinzufügen des Filters zu überprüfen:

 global $wp_query; if ($wp_query->is_post_type_archive('rg_blog')) { add_action('pre_get_posts','blog_filter'); } 

Auf diese Weise wird es nicht bei jedem Laden der Seite ausgeführt.


Versuchen Sie, den Filter vor der zweiten Abfrage zu entfernen:

 remove_action('pre_get_posts', 'blog_filter');