Überschreiben wp_get_archives () apply_filters ()

Ich habe eine Weile gegoogelt und bin mir nicht sicher, wie es am besten ist.

In wp-includes/general-template.php schaue ich auf die function wp_get_archives() welche diese Codezeile hat in:

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );

Was ich machen möchte, ist:

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'", $r );

Ich bin mir jedoch nicht sicher, wie ich diesen Filter einbinden und in der functions.php überschreiben soll

Jeder Rat geschätzt.

Vielen Dank,

Ian

Solutions Collecting From Web of "Überschreiben wp_get_archives () apply_filters ()"

Ein WordPress-Filter ist eine function, die eine Zeichenfolge, ein Array oder ein Objekt aufnimmt, etwas dagegen tut und diese gefilterte Zeichenfolge, das Array oder das Objekt zurückgibt.

Was Sie also tun möchten, ist "WHERE post_type = 'post' AND post_status = 'publish'" in "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'" . Das ist ziemlich einfach.

Aus der getarchives_where der getarchives_where akzeptiert der getarchives_where Filter zwei Argumente. Also haken Sie den Filter so an:

 add_filter( 'getarchives_where', 'my_fancy_filter_function', 10, 2 ); 

Dann müssen Sie eine function schreiben, die zwei Parameter akzeptiert, sie filtert und eine Zeichenfolge zurückgibt:

 function my_fancy_filter_function( $text, $r ) { return "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'"; } 

Jetzt nimmt diese function jede Eingabe auf, aber sie gibt immer die Zeichenfolge für den von Ihnen angegebenen Filter zurück. Es gibt viel mehr Möglichkeiten zum Hinzufügen von Abfrageparametern, aber dies wird genau das erreichen, was Ihre Frage verlangt.

In einem Plugin oder in der functions.php deines Themes schreib einfach:

 add_filter( 'getarchives_where', 'wpse_67264_filter_getarchives_where' ); /** * Add post type 'events' to wp_get_archives() query. * * No parameters needed because we ignore them anyway. * * @wp-hook getarchives_where * @return string New WHERE clause */ function wpse_67264_filter_getarchives_where() { return "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'"; } 

Das ist meiner Meinung nach besser als eine benutzerdefinierte WP_Query , und Sie müssen keine Parameter in Ihrem Callback akzeptieren, da Sie theme nicht verwenden. 🙂

Um zu verstehen, wie Filter funktionieren, lesen Sie den Codex in der Plugin-API . Im Grunde wird Ihr Callback-Rückgabewert den zweiten Teil in apply_filters() ersetzen.

Was Sie wirklich tun möchten, ist die integrierte WordPress-class namens WP_Query . Auf diese Weise ändern Sie nicht die eigentliche WordPress-corefunktionalität (was Ihnen große Kopfschmerzen bereiten würde, wenn es Zeit für ein Upgrade ist).

Ersetzen Sie auf Ihrer Archivseite Ihre aktuelle Schleife durch eine benutzerdefinierte Abfrage wie folgt:

 $args = array(); // setup the custom posts you want in here $custom_query = new WP_Query($args); // build a custom query while($custom_query->have_posts()) : $custom_query->the_post(); // inside the loop, show your posts endwhile; wp_reset_postdata(); // reset the query 

Das $args Array ist einfach Ihre benutzerdefinierte Logik, in der Posts innerhalb dieser Schleife angezeigt werden sollen. Eine vollständige Liste der Dinge, die Sie in dieses Array einfügen können, finden Sie in der WP_Query-Dokumentation .

Wenn Sie beispielsweise nach dem Post-Typ filtern möchten, sehen Sie sich diesen Abschnitt des Dokuments an und Sie werden feststellen, dass Sie Ihr $args Array wie folgt erstellen können:

 $args = array('post_type' => array('post', 'events')) 

Ich hoffe, das hilft!

[bearbeiten]

Ich habe gerade festgestellt, dass Sie vielleicht eine einfache ungeordnete Liste von Beiträgen im Archiv erhalten möchten (und nicht notwendigerweise die Beiträge selbst anzeigen, da sich wp_get_archives verhält).

Erstellen Sie einfach Ihre eigene ungeordnete Liste, indem Sie die Schleife in ein

    -Tag und dann in die Schleifenausgabe

  • -Tags um den Titel des archivierten Posts und den Permalink in den archivierten Post einfügen .