Bedingtes widget_form_callback

Ich habe versucht, eine Möglichkeit zu entwickeln, etwas in einem Widget nur dann zu setzen, wenn das Widget in einer bestimmten Sidebar existiert. Der folgende Code sucht nach der Seitenleiste mit der Bezeichnung “Fußzeile” und zeigt die Auswahloption über den Standardoptionen im Widget an.

Es erscheint jedoch nicht, wenn ich ein neues Widget in die Seitenleiste ziehe. Wenn ich Speichern drücke, erscheint die Option, wo ich dann die Option auswählen und erneut auf Speichern drücken muss. Was fehlt mir, um sicherzustellen, dass es geladen wird, sobald es in die Sidebar gezogen wird?

function mytheme_colspan_widget_extend( $instance, $widget ) { if ( !isset($instance['colspan']) ) $instance['colspan'] = 3; // set a default if none is set foreach ( wp_get_sidebars_widgets() as $sidebar => $widgets ) { if ('footer' == $sidebar && in_array( $widget->id, $widgets )) { echo "

\n"; echo "\t \n"; ?> <select name="widget-id_base.'['.$widget->number.'][colspan]'; ?>" id="widget-id_base.'-'.$widget->number; ?>-colspan"> Select: <option value="1">1 <option value="2">2 <option value="3">3 <option value="4">4 <option value="5">5 <option value="6">6 <option value="7">7 <option value="8">8 <option value="9">9 <option value="10">10 <option value="11">11 <option value="12">12 <?php echo "

\n"; } } return $instance; } add_filter('widget_form_callback', 'mytheme_colspan_widget_extend', 10, 2); function mytheme_colspan_widget_update( $instance, $new_instance ) { $instance['colspan'] = $new_instance['colspan']; return $instance; } add_filter( 'widget_update_callback', 'mytheme_colspan_widget_update', 10, 2 );

Solutions Collecting From Web of "Bedingtes widget_form_callback"

Sie müssen das Array der Sidebars und ihrer Widgets mit wp_get_sidebars_widgets () abrufen und dann prüfen, ob sich das aktuelle Widget in der 'footer' :

 $sidebars = wp_get_sidebars_widgets(); if ( in_array( $widget->id, $sidebars['footer'] ) ) { /* Display form fields here */ } 

Aktualisieren:

Es gibt eine Einschränkung, die Sie entdeckt haben. Das Widgetformular wird ausgegeben, bevor ein neues Widget einer Seitenleiste zugewiesen wird. Es wird erst wieder geladen, wenn die Widgeteinstellungen gespeichert wurden. Wenn Sie möchten, dass alle Einstellungen sofort verfügbar sind, müssen Sie dies entweder mit CSS oder JavaScript lösen. Ich denke, CSS ist der beste Weg zu gehen, wenn Ihre Fußleiste Sidebar immer die gleiche numerische ID haben wird (das sollte wahr sein, wenn die Anzahl der Seitenleisten nicht dynamisch ist – obwohl Leute zusätzliche benutzerdefinierte Seitenleisten hinzufügen könnten, nehme ich an).

Wenn das Widget nicht an eine Sidebar angehängt ist, geben Sie Ihre Formulareingabe aus und verstecken sie mithilfe von CSS, sofern sie nicht in die richtige Sidebar verschoben wird.

Sie können die Überprüfung folgendermaßen durchführen:

 if ( '__i__' == $widget->number ) { /* This widget isn't hooked to a sidebar yet. */ } 

Ihr vollständiger Check würde also etwa so aussehen:

 $sidebars = wp_get_sidebars_widgets(); if ( '__i__' == $widget->number || in_array( $widget->id, $sidebars['footer'] ) ) { /* Display form fields here */ } 

Beispiel für das CSS unter der Annahme, dass die Fußleiste immer die Nummer 3 hat:

  

Sie können diese Stile beispielsweise zu Ihrem Admin-Stylesheet hinzufügen und dann die show-if-sidebar-3 class zum Absatz-Tag hinzufügen, in dem Sie die zusätzlichen Felder wie

:

Ich kann mir keine Alternative vorstellen, es sei denn, Sie möchten JavaScript verwenden, um zu erkennen, wann ein Widget dieses speziellen Typs zu dieser bestimmten Sidebar hinzugefügt wird, und das Formular sofort erneut laden. Das ist jedoch viel komplexer.