it-swarm.com.de

Entfernen Sie Ellipsen aus dem mit get_the_excerpt () abgerufenen Auszug.

Ich verwende eine benutzerdefinierte WP_query, um ein Karussell mit dem neuesten Beitrag auf einer Seite ohne Hauptschleife anzuzeigen. In der WP_query-Schleife verwende ich get_the_excerpt(), um den automatisch generierten Auszug dieser Posts abzurufen. Die Posts haben weder einen benutzerdefinierten Auszugssatz noch ein <!--more--> -Tag. Diese generierten Auszüge enthalten jedoch am Ende eine abschließende Ellipse (...) (keine tatsächliche Ellipse, sondern drei Punkte).

Allen verwandten Posts und dem Codex zufolge sollte es mir möglich sein, die nachgestellten Punkte zu ändern oder zu entfernen, indem ich dem Hook excerpt_more einen Filter hinzufüge. Ich habe diesen Code zu meinem functions.php hinzugefügt:

add_filter('excerpt_more', 'change_excerpt_more', 1);
function change_excerpt_more($more){
  return '';
}

Aber es tut einfach nichts. Ich habe verschiedene Varianten davon ausprobiert (einen Teststring zurückgeben, die Funktion kein Argument akzeptieren lassen, die Priorität des add_filter-Aufrufs ändern), aber die generierten Auszüge ändern sich überhaupt nicht.

Mache ich etwas falsch? Funktioniert der Filter nicht mit einer benutzerdefinierten WP_query? Wie kann ich das beheben?

Vielen Dank!

2
MoritzLost

Das dritte Feld in add_filter() hat Priorität. Die Standard-Hook-Priorität für WP ist 10. Sie können die 1 ganz weglassen oder die Anzahl der Argumente, die von der Funktion akzeptiert werden, deklarieren, indem Sie sie als 4. Feld übergeben. add_filter('excerpt_more', 'change_excerpt_more', 10, 1);

ODER für Standard: add_filter('excerpt_more', 'change_excerpt_more');


re: Fragen in Kommentaren

ich frage mich immer noch, warum es nicht funktionieren würde, ohne eine Priorität überschritten zu haben

sie haben eine Priorität überschritten

Das Problem, das Sie hatten, war, dass Sie eine Priorität (1) übergeben haben und dass sie möglicherweise niedriger war als einige andere Dinge, die diesen Hook verwendeten. Es könnte also gut gelaufen sein, wurde aber erst überschrieben, nachdem es ausgeführt wurde.

Die Methoden add_filter und add_action bestehen aus vier Teilen:

  1. der durch apply_filters('name'... bzw. do_action('name'... definierte Filter oder die Aktion.
  2. die anzuwendende Rückruffunktion, Ihre change_excerpt_more()
  3. die Priorität ist ein ganzzahliger Wert, der standardmäßig 10 ist
  4. die Anzahl der vom Rückruf erwarteten Argumente (verfügbar gemacht durch den do_action und den apply_filter)

In dem Beispiel in Ihrer Frage haben Sie also 1 als Priorität übergeben, da es sich im dritten Feld befindet. Angenommen, Sie wollten das Argument single ($more) definieren, müssten Sie explizit eine Priorität oder ein leeres Feld übergeben (wordpress würde die Standardpriorität verwenden).

dein Code:

Diese:

add_filter('excerpt_more', 'change_excerpt_more', 1);

Ist das gleiche wie:

add_filter('excerpt_more', 'change_excerpt_more', 1, 1);


das einzelne Argument zu definieren

Wie so:

add_filter('excerpt_more', 'change_excerpt_more', , 1);

Das ist dasselbe wie:

add_filter('excerpt_more', 'change_excerpt_more', 10, 1);

Und da excerpt more nur ein Argument zu übergeben hat, ist dies auch dasselbe wie: add_filter('excerpt_more', 'change_excerpt_more');


Bei Priorität

Die Priorität wird zum numerischen Schlüssel in einem Array von Filtern/Aktionen, die auf den Hook angewendet werden. Nach diesen numerischen Indizes sortiert, werden sie in dieser Reihenfolge ausgeführt. Da es sich nur um ein (int) handelt, das als Index verwendet wird, ist die einzige Einschränkung PHP_INT_MAX. Wordpress verwendet standardmäßig 10, sodass Hooks problemlos davor oder danach ausgeführt werden können. Da der Hook ansonsten nicht verwendet wird, wird nach jeder Core-Verwendung eine Standardpriorität ausgeführt, da sie dem Hook nachträglich hinzugefügt wurde. Um sicherzugehen, dass Sie Ihren Hook ausführen, nachdem standardmäßig etwas hinzugefügt wurde, können Sie eine höhere Priorität übergeben.

Ihr Problem war jedoch erneut, dass Ihre Priorität zu hoch war (1), da sich dieser Wert im dritten Feld des add_filter befand. Also lief es, und dann lief alles, was standardmäßig eingebunden war (könnte ein Theme, ein anderes Plugin oder sogar ein Core sein).

Um zu wissen, ob alle Hooks mit ihrer Priorität verknüpft sind, können Sie print_r()$wp_filter den Namen des Hooks als Schlüssel für das Array übergeben.

function filter_print() {
    global $wp_filter;
    print_r( $wp_filter['excerpt_more'] );
    die();
}
add_action( 'shutdown', 'filter_print' );

[Code von Howdy_McGee on diese WPSE-Antwort]

2
hwl