Wie man Aktionen und Filter “richtig” durch Bedingungen einschränkt

Welcher ist richtig, wenn man Aktionen / Filter / etc hinzufügt … Beide Methoden funktionieren gut und ich habe gesehen, dass Leute beides tun, aber ich gehe davon aus, dass einer korrekt ist. Mein Bauchgefühl sagt mir, dass es besser ist, die if-statement um die Aktion herum zu verpacken, aber ich bin mir nicht sicher …

Methode A: Wrapping um add_action :

 function unregister_default_wp_widgets() { unregister_widget('WP_Widget_Pages'); unregister_widget('WP_Widget_Calendar'); unregister_widget('WP_Widget_Archives'); unregister_widget('WP_Widget_Links'); unregister_widget('WP_Widget_Meta'); unregister_widget('WP_Widget_Search'); unregister_widget('WP_Widget_Text'); unregister_widget('WP_Widget_Categories'); unregister_widget('WP_Widget_Recent_Posts'); unregister_widget('WP_Widget_Recent_Comments'); unregister_widget('WP_Widget_RSS'); unregister_widget('WP_Widget_Tag_Cloud'); unregister_widget('WP_Nav_Menu_Widget'); } if( !current_user_can('administrator') ) { add_action('widgets_init', 'unregister_default_wp_widgets', 1); } 

—- ODER —–

Methode B: Wrapping um functionsdefinition und add_action :

 if( !current_user_can('administrator') ) { function unregister_default_wp_widgets() { unregister_widget('WP_Widget_Pages'); unregister_widget('WP_Widget_Calendar'); unregister_widget('WP_Widget_Archives'); unregister_widget('WP_Widget_Links'); unregister_widget('WP_Widget_Meta'); unregister_widget('WP_Widget_Search'); unregister_widget('WP_Widget_Text'); unregister_widget('WP_Widget_Categories'); unregister_widget('WP_Widget_Recent_Posts'); unregister_widget('WP_Widget_Recent_Comments'); unregister_widget('WP_Widget_RSS'); unregister_widget('WP_Widget_Tag_Cloud'); unregister_widget('WP_Nav_Menu_Widget'); } add_action('widgets_init', 'unregister_default_wp_widgets', 1); } 

Solutions Collecting From Web of "Wie man Aktionen und Filter “richtig” durch Bedingungen einschränkt"

Es gibt keinen wirklichen Unterschied zwischen den beiden Methoden.
Wenn Methode A verwendet wird, ist nur das Hooking an die Bedingung gebunden (dh die function ist definiert, egal was), während in Methode B sowohl die Definition der function als auch das Hooking erfolgt.

Eine andere Sache ist die folgende Methode (die du nicht eingeschlossen hast):

 function my_hooked_function() { if (! current_user_can('administrator')) { $some_var = 'some value'; some_function($some_var); } } // function my_hooked_function add_action('widgets_init', 'my_hooked_function'); 

Da die vollständige Bedingung bereits außerhalb der function (dh direkt in Ihrer functions.php Datei) ausgewertet werden kann, sollte die Methode A / B bevorzugt werden. Andernfalls würden Sie Ihre function jedes Mal und für alle Benutzer aktivieren, während sie nur von Administratoren verwendet wird.

Es gibt jedoch Bedingungen, die nicht außerhalb der hooked-function gesetzt (dh ausgewertet) werden können, da einige Variablen und / oder Objekte, die in der Bedingung verwendet werden, noch nicht definiert / zugänglich sind. In diesem Fall müssen Sie die Bedingung in die function einfügen (wie in dieser Antwort gezeigt).

Ein Beispiel:

 // NOT working if (is_front_page()) add_action('shutdown', function() { echo 'Front'; }); // WORKING add_action('shutdown', function() { if (is_front_page()) echo 'Front'; }); 

Hier ist ein anderer Weg.

 function unregister_default_wp_widgets() { if( !current_user_can('update_core') ) { unregister_widget('WP_Widget_Pages'); unregister_widget('WP_Widget_Calendar'); unregister_widget('WP_Widget_Archives'); unregister_widget('WP_Widget_Links'); unregister_widget('WP_Widget_Meta'); unregister_widget('WP_Widget_Search'); unregister_widget('WP_Widget_Text'); unregister_widget('WP_Widget_Categories'); unregister_widget('WP_Widget_Recent_Posts'); unregister_widget('WP_Widget_Recent_Comments'); unregister_widget('WP_Widget_RSS'); unregister_widget('WP_Widget_Tag_Cloud'); unregister_widget('WP_Nav_Menu_Widget'); } } add_action('widgets_init', 'unregister_default_wp_widgets', 1); 

Sorry für die späte Antwort, aber nichts davon machte mir wirklich noch Sinn, bis ich heute auf eine Situation stieß.

Am Ende fügte ich die folgende function in das mu-plugin-Verzeichnis ein, die Nicht-Admins zum Dashboard umleitete, wenn sie versehentlich auf bestimmte Seiten stieß, auf denen sie nicht waren.

 function wp_admin_pages_redirect_to() { global $pagenow; $admin_pages = array( 'themes.php', 'edit-tags.php?taxonomy=post_tag', 'options-general.php', ); if(in_array($pagenow, $admin_pages)) { wp_redirect( admin_url('/') ); exit; } } if( !current_user_can('administrator') ) { add_action('admin_init', 'wp_admin_pages_redirect_to'); } 

Dies würde mir jedoch den weißen Bildschirm des Todes geben. Nachdem ich @Rilwis Kommentar gelesen hatte, versuchte ich Folgendes und es funktionierte gut.

 function wp_admin_pages_redirect_to() { if( !current_user_can('administrator') ) { global $pagenow; $admin_pages = array( 'themes.php', 'edit-tags.php?taxonomy=post_tag', 'options-general.php', ); if(in_array($pagenow, $admin_pages)) { wp_redirect( admin_url('/') ); exit; } } } add_action('admin_init', 'wp_admin_pages_redirect_to'); 

Wie auch immer, das Lesen von @Rilwis Kommentar zu Brads Vorschlag hat mich schließlich (irgendwie) klar gemacht, worüber @tf sprach und wie bestimmte Bedingungen außerhalb der function nicht bewertet werden können. Ich hoffe, dass er darüber redet.