Wann Aktionen zu verwenden sind und wann Filter zu verwenden sind

Ich versuche zu verstehen, wo Filter zu verwenden sind und wo Aktionen zu verwenden sind.

Angenommen, ich habe eine Abfrage in einem Plug-In, die später von Add-On-Modulen geändert wird, um die Ergebnisse der Abfrage zu ändern und so die Argumente zu ändern.

Wäre dies eine ideale Umsetzung dieses Konzepts, oder sollte ich hier handeln?

// function zum Anzeigen der Seitenliste

function get_page_list() { $pages_args = array( 'post_type' => 'page', 'posts_per_page' => '1' ); $pages_query = new WP_Query( apply_filters( 'myfilter', $pages_args ) ); if( $pages_query->have_posts() ) { while ( $pages_query->have_posts() ) : $pages_query->the_post(); echo get_the_title(); endwhile; // Reset Post Data wp_reset_postdata(); } else echo 'no results found'; } add_action( 'wp_footer', 'get_page_list', 1); function change_page_to_post( $pages_args ) { $pages_args = array( 'post_type' => 'post', 'posts_per_page' => '1' ); return $pages_args; } add_filter('myfilter', 'change_page_to_post'); 

Solutions Collecting From Web of "Wann Aktionen zu verwenden sind und wann Filter zu verwenden sind"

+1 für beide anderen Antworten, um die primären Unterschiede zwischen Aktionen und Filtern zu erklären.

Um jedoch Ihre spezifische Frage zu beantworten, die Sie zum Ändern einer Abfrage verwenden sollten, gehen Sie wie folgt vor:

  1. Wenn Sie Ihre benutzerdefinierte Abfrage in die Vorlage einfügen , müssen Sie sich , wie Sie vermuten, in eine vorhandene Aktion einklinken. (Ob wp_footer die richtige / ideale Aktion ist oder nicht, ist eine andere Sache und hängt davon ab, wie genau Sie diese Abfrage verwenden möchten.
  2. Das Zulassen Ihrer benutzerdefinierten Abfrage wird wahrscheinlich am besten mit einem benutzerdefinierten Filter durchgeführt , an den sich andere Plugins anhängen können.

Zum Beispiel, beginnend mit diesem Code:

 function get_page_list() { $pages_args = array( 'post_type' => 'page', 'posts_per_page' => '1' ); $pages_query = new WP_Query( apply_filters( 'myfilter', $pages_args ) ); if( $pages_query->have_posts() ) { while ( $pages_query->have_posts() ) : $pages_query->the_post(); echo get_the_title(); endwhile; // Reset Post Data wp_reset_postdata(); } else echo 'no results found'; } add_action( 'wp_footer', 'get_page_list', 1); 

Wenn Sie möchten, dass dieser Code erweiterbar ist, müssen Sie anderen die Möglichkeit geben, ihn zu erweitern. Ich würde empfehlen, Ihre benutzerdefinierten Abfrageargumente über benutzerdefinierte Filter erweiterbar zu machen . zB das:

 $pages_args = array( 'post_type' => 'page', 'posts_per_page' => '1' ); 

… könnte leicht so werden:

 $pages_args = apply_filters( 'custom_filter_name', array( 'post_type' => 'page', 'posts_per_page' => '1' ) ); 

Das würde dann anderen Plugins erlauben, Ihre Anfrageargumente zu modifizieren. Zum Beispiel, wenn ein Plugin zwei Beiträge zurückgeben wollte, anstatt eines :

 function wpse73840_modify_custom_filter_name( $args ) { // Modify posts_per_page $args['posts_per_page'] = '2'; // Return modified args return $args; } add_filter( 'custom_filter_name', 'wpse73840_modify_custom_filter_name' ); 

Ich denke, das kommt zu dem, was du fragst. Wenn nicht, lass es mich in den Kommentaren wissen.

Der grundlegende Unterschied besteht darin, dass Filter einen gewissen Wert ändern sollen und Aktionen dazu dienen sollen, etwas Arbeit zu leisten. Sie funktionieren fast genauso wie im Code, aber der Unterschied besteht darin, dass Filter einen Wert zurückgeben müssen, während dies bei Aktionen nicht der Fall ist.

Angenommen, Ihr Plugin hat eine neue Seite in der database erstellt. Nachdem die Aufgabe abgeschlossen ist, möchten Sie, dass andere Personen der neuen Seite einige benutzerdefinierte Felder hinzufügen. Für diese Aufgabe möchten Sie eine Aktion senden. Andere Plugins greifen hier ein und fügen die Felder nur beim Erstellen der Seite hinzu

Nehmen wir an, Sie werden dem Benutzer eine Nachricht anzeigen, aber Sie möchten, dass diese Nachricht von anderen Plugins angepasst werden kann. Dann wenden Sie einen Filter an. Andere Plugins, die sich in den Filter einklinken, ändern diese Nachricht und geben sie an Sie zurück. Jetzt zeigen Sie dem Benutzer die neue Nachricht an. Nicht das, was du ursprünglich beabsichtigt hast.

Aus diesem Grund geben Filter immer einen Wert zurück, während der Rückgabewert einer Aktion ignoriert wird.

Bitte beachten Sie, dass dies keine Regel in Bezug auf die Codierung ist. Sie können das eine oder andere verwenden, wie Sie möchten, und es wird keine Fehler casting, aber sie sind anders in ihrer Bezeichnung und wie WordPress sie bestimmt hat und es wird sehr empfohlen, dass Sie diesem Muster folgen.

Meinen Glückwunsch. Du verstehst das Thema perfekt. Filtert, wenn Sie den eingehenden Inhalt ändern möchten (deshalb Filter). Aktion, die etwas tun möchte (deshalb Aktion).