Wie füge ich eine einzelne function für alle WordPress-Hooks hinzu

Wie kann ich eine einzelne WordPress-function für alle WordPress-Aktionen / -Ereignisse hinzufügen?

Ich möchte etwas hinzufügen, das dem folgenden entspricht

add_Action('All WordPress Event/Actions', 'My_Function'); 

Und ich wollte diese function so kompatibel machen, dass ich alle impliziten Systemargumente wie unten erhalten werde

  • My_Function($content);

  • My_Function($postId);

$content und $postId sind implizite Argumente, die vom WordPress-System übergeben werden …

Solutions Collecting From Web of "Wie füge ich eine einzelne function für alle WordPress-Hooks hinzu"

Es gibt eine spezielle Aktion, die Sie verwenden können. Sei dir bewusst, das wird sehr langsam sein, mach das nicht in der Produktion.

Hier ist ein Beispiel:

 add_action( 'all', function() { static $hooks = []; $filter = current_filter(); if ( isset ( $hooks[ $filter ] ) ) return; $types = array_map( function ( $arg ) { return gettype( $arg ); }, func_get_args() ); $hooks[ $filter ] = count( $types ) . ' arguments: ' . join( ",\t", $types ); if ( 'shutdown' !== $filter ) return; $text = "\n\nFILE: " . $_SERVER['REQUEST_URI'] . ' ' . date( 'Ymd H:i:s' ) . "\n\n"; foreach ( $hooks as $hook => $args ) $text .= str_pad( $hook, 50 ) . " => $args\n"; $file = WP_CONTENT_DIR . '/hook.log'; file_put_contents( $file, $text, FILE_APPEND | LOCK_EX ); }); 

Jetzt erhalten Sie alle Haken in einer Datei hooks.log . Beispielausgabe:

 FILE: /wp-admin/admin-ajax.php 2015.03.29. 17:25:41 muplugins_loaded => 1 arguments: string pre_site_option_siteurl => 2 arguments: string, boolean site_option_siteurl => 2 arguments: string, string pre_option_siteurl => 2 arguments: string, boolean option_siteurl => 2 arguments: string, string gettext_with_context => 5 arguments: string, string, string, string, string gettext => 4 arguments: string, string, string, string registered_taxonomy => 4 arguments: string, string, string, array sanitize_key => 3 arguments: string, string, string post_type_labels_post => 2 arguments: string, object registered_post_type => 3 arguments: string, string, object post_type_labels_page => 2 arguments: string, object post_type_labels_attachment => 2 arguments: string, object post_type_labels_revision => 2 arguments: string, object post_type_labels_nav_menu_item => 2 arguments: string, object theme_root => 2 arguments: string, string pre_option_active_plugins => 2 arguments: string, boolean … 

Das ist eine sehr sehr schlechte Idee.

Sie können dies erreichen, indem Sie Folgendes tun:

 add_action( 'init', function(){ do_action()//rinse recycle repeat for every hook }); 

Ich empfehle sehr hoch, dass Sie diesen Weg nicht nehmen. Es kann viele Probleme verursachen, wenn Haken nicht benötigt werden, usw.

Die Idee eines Hooks ist es, die functionalität des processes, der gerade verarbeitet wird, zu erweitern. Sie erhalten Daten, die nur während bestimmter Aktionen wie dem Hinzufügen von Kommentaren verfügbar sind.

Wenn Sie do_action für jeden einzelnen Hook ausführen, könnte dies katastrophal sein. Ganz zu schweigen davon, dass Sie für jeden Hook keine Daten haben.

Wenn Sie eine function buchstäblich jedes Mal auslösen möchten, wenn eine Seite geladen wird, verwenden Sie den Init-Hook, für das Admin-Feld nur admin_init

Aber feuern Sie nicht jede einzelne WordPress-Aktion in einem Hook. Es ist einfach keine gute Idee

Nur um alle Gründe zu erfassen

Machen:

 add_action( 'init', function(){ add_action( 'hook', function(){ // do code here }) }) 

Dadurch wird die function an jedem Haken ausgetriggers, aber feuern Sie nicht jeden Haken an einem Haken. Natürlich würden Sie für jeden Hook, mit dem Sie die function auslösen möchten, eine separate add_action durchführen, aber es gibt keine echte Möglichkeit, Hooks auszulösen.

Ein etwas besserer Weg zur Wiederverwendung von Code könnte sein:

 add_action( 'init', function(){ $hooks = array( 'hook1', 'hook2', 'hook3'//and so on. ); foreach( $hooks as $hook ){ add_action( $hook, function(){ // Do code }); } // Do the same but in add_filter }); 

Um alle Gründe abzudecken, würde diese Methode direkt oben die Aktion / den Filter hinzufügen, aber die Aktion / der Filter würde nicht ausgetriggers werden, bis sie mit apply_filter oder do_action ausgetriggers wird, dies fügt einfach die function der Aktion oder dem Filter hinzu.

Dann müßten Sie daran arbeiten, die Argumente der function zu akzeptieren, ohne das vierte Argument add_action anzugeben. Sie haben also nur ein Argument, so daß Sie in Ihrem Code filtern müßten, mit welchem ​​Argument Sie arbeiten, mit ein paar Wenn oder Elsen.

Als Antwort auf einen Kommentar zur Erläuterung des Arguments könnten Sie etwas ähnliches tun:

 add_action( 'init', function(){ $hooks = array( 'hook1' => array( 'argname1', 'argname2', 'argname3' ), 'hook2' => array( 'argname1', 'argname2', 'argname3' ), 'hook3' => array( 'argname1', 'argname2', 'argname3' )//and so on. ); foreach( $hooks as $hook=>$args ){ add_action( $hook, function(){ $numargs = func_num_args(); for( $i=0; $i< $numargs; $i++ ){ $$args[$i] = func_get_arg($i); } // Do code }, 10, count( $args ) ); } // Do the same but in add_filter }); 

Dann mit dem für Sie würde natürlich die Anzahl der Argumente beurteilen, die Sie benötigen, um Fehler zu vermeiden.

Um Fehler besser zu vermeiden, überprüfen Sie, ob $ args [$ i] existiert oder nicht leer ist, bevor Sie func_get_arg darauf setzen.

Antwort auf Kommentar: Hier ist ein Echtzeit-Beispiel, wie Sie dies mit save_post Aktion verwenden würden

 add_action( 'init', function(){ $hooks = array( 'save_post' => array( 'post_id', 'post', 'update' ) ); foreach( $hooks as $hook=>$arg ){ add_action( $hook, function(){ // Note we dont do any args here $num_args = func_num_args(); // would return 3 because we supplied 3 args for( $i=0; $i< $num_args; $i++ ){ if( !empty( $arg[$i] ) ){ $$arg[$i] = func_get_arg( $i ); // We use !empty as it will check if isset AND not empty // This would set all three array values to the respective variable // $post_id, $post, $update // Make sure you put the args in the right order in the hooks array above to avoid mixing up var names. } } if( isset( $post ) ){ update_post_meta( $post->ID, 'meta_key_whatever_you_want', 'meta_value_whateveryouwant' ); // I used $post to show you that the second argumnet supplied by do_action is $post and we set $$arg[1] as $post and retrieved the arg with same key 1 Normally you would just use post_id } // Can do with any of the args just be carefull. }, 10, count( $args ) ); // We count the hook arg array which is the array with simple strings for our variable names and supply it to add_action to let wordpress know we want 3 arguments. If you supply more than 3 arguments you may get errors for this hook, so setting array with 50 args for a hook that only supplies 3 is not good. // 10 is simply priority in which this hook fires. } }); 

Dies ist nur eine Möglichkeit, dies zu tun, dann würden Sie einfach einen Array-Schlüssel für Hook und Array für Argumente für jeden Hook durchführen und prüfen, ob die Variable gesetzt ist. Vielleicht möchten Sie eine zusätzliche Verifizierung für Variablen durchführen, um sicherzustellen, dass Sie die richtigen Daten haben, da einige Hooks Variablennamen gemeinsam nutzen. Sie können jedoch anpassen, sodass $ post_id auf $$ arg [0] und im arg-Array auf as gesetzt werden kann 'post_id_custom', die mit den von hooks $ post_id gelieferten Daten auf $ post_id_custom gesetzt werden würde.

Noch etwas, um Dinge wirklich komplett zu vereinfachen, können Sie das auch tun:

 function someFunc(){ // do code here } add_action('hook1', 'someFunc' ); add_action('hook2', 'someFunc' ); add_action('hook3', 'someFunc' ); add_action('hook4', 'someFunc' ); 

Dies wird den gleichen Spaß mit allen mitgelieferten Aktionshaken auslösen.

 add_action( 'all', function() { static $hooks = []; global $allhooks; $filter = current_filter(); if ( isset ( $hooks[ $filter ] ) ) return; $types = array_map( function ( $arg ) { return $arg; }, func_get_args() ); $hooks[$filter] = $types; if( 'shutdown' !== $filter ) return; foreach( $hooks as $hook=>$args ){ $allhooks[$hook] = $args; } }); add_action( 'shutdown', function(){ global $allhooks; var_dump( $allhooks ); }); 

Dies wird alle Haken und alle Argumente, die mit den Haken fyi kommen, drucken. Einfache Änderung von toschos Code, var_dumps so etwas für jeden Hook.

 array (size=809) 'after_setup_theme' => array (size=1) 0 => string 'after_setup_theme' (length=17) 'ot_theme_mode' => array (size=2) 0 => string 'ot_theme_mode' (length=13) 1 => boolean false 'ot_child_theme_mode' => array (size=2) 0 => string 'ot_child_theme_mode' (length=19) 1 => boolean false 'ot_show_pages' => array (size=2) 0 => string 'ot_show_pages' (length=13) 1 => boolean true 

Dadurch wird es einfach an den Browser übergeben, was einfach wiederholt wird und Ihnen hilft zu erklären, was Toscho sagt, dass Argumentnamen nicht nur Werte sind.

Nach der Überprüfung fehlen Hooks wie save_post. So liefert nicht einmal der All-Hook alle Aktionen und Filter.

Es gibt wirklich keine Möglichkeit, dies zu erreichen, und es ist wirklich eine schlechte Idee.

Auch hier bin ich kein WordPress-Experte.