it-swarm.com.de

Widget-Optionen über die functions.php ändern, wenn keine Hooks vorhanden sind

Das Problem : die Optionen eines Widgets mit einer benutzerdefinierten Funktion in functions.php zu ändern, wenn es keine nützlichen Hooks gibt und wenn das mehrfach vorkommt gleiches Widget (Multiwidget).

Dies würde beinhalten:

  1. Abrufen der Optionen aus "widget_some-widget" in der Tabelle "wp_options". (Die zurückgegebene Option enthält eine Reihe von Einstellungen (in serialisierter Form), die mehrmals wiederholt wurden und mehreren eindeutigen Vorkommen desselben Widgets entsprechen.)

  2. Ändern des Werts von beispielsweise dem dritten Vorkommen einer Optionsinstanz mit dem Namen some_name von "alter Wert" in "neuer Wert" und eines anderen mit dem Namen some_other_name von "alter Wert" in "neuer Wert". (Kann es sein, dass jedes Vorkommen des Widgets eine eigene ID in der serialisierten Optionszeichenfolge hat, die irgendwie erkannt werden könnte?)

  3. Aktualisieren der Datenbank mit den geänderten Optionen

d.h. etwas in diese Richtung -

function change_widget_configuration() {

    $options = get_option('widget_some-widget');

// [code to parse $options string to ensure the correct occurrences of 'some_name' and 'some_other_name' have their values changed]

/* third-occurrence of */    $options['some_name'] = 'new value';
/* third-occurrence of */    $options['some_other_name'] = 'new value';

    update_option('widget_some-widget', $options);

}

Die serialisierte Optionszeichenfolge des Widgets könnte ungefähr so ​​aussehen (abzüglich der Auslassungspunkte):

i:3;a:20:{s:5:"title";s:8:"My Title";s:9:"some_name";s:11:"Bit of text";s:15:"some_other_name";s:2:"17"; [...] s:14:"more_from_this";s:29:"More articles on this subject";}s:12:"_multiwidget";i:1;}

Welche Art von Ansatz kann gewählt werden (mit dem oben auskommentierten Code), um dieses Problem zu lösen? *

* Dies wäre sehr nützlich, um die Ausgabe von Widgets von Drittanbietern (die keine nützlichen Hooks haben) zu steuern, ohne ihren Code ändern oder große Teile davon in der functions.php wiederholen zu müssen

1
maduroblanco

Nach einigem Graben bin ich zu einer Lösung gekommen (erklärt in den Kommentaren) -

function change_widget_configuration() {

$options = get_option('widget_some-widget'); // retrieve the options for all occurrences of the named widget*

    $widget_number = 3; // the id number of the specific occurrence of the widget whose options you wish to alter (this can be obtained simply in the html from the <div id=""> tag of the specific widget)

    $sub_options = $options[$widget_number]; // this now contains the options of the specific occurrence of the widget**

        $sub_options['some_name'] = 'new value'; // change any named option*
        $sub_options['some_other_name'] = 'new value';

    $options[$widget_number] = $sub_options // pass the changes back to the multi-widget array

update_option('widget_some-widget', $options); // write the altered widget options back into the wp_options table*

}

* Fügen Sie geeignete Bedingungsanweisungen hinzu, um zu überprüfen, ob die Optionen vorhanden sind, bevor Sie das Array abrufen oder aktualisieren.

** Dies ist die spezielle Lösung für Multi-Widgets.

Das ist es! Mit dieser einfachen kleinen Funktion können wir jetzt die Ausgabe aller Arten von Widgets steuern, indem wir einfach ihre Optionen programmgesteuert ändern, anstatt manuell oder in den Code zu hacken. Zum Beispiel habe ich jetzt ein Drittanbieter-Widget auf der Startseite eines Blogs, das normalerweise eine Liste der Beiträge aus einer festgelegten Kategorie anzeigt, deren Kategorie (und Titel) sich nun in regelmäßigen Abständen gemäß einer Gewohnheit ändert Funktion in functions.php platziert. Die Anwendungsmöglichkeiten sind endlos und es werden viele Probleme bei der Interaktion mit Plugins gelöst, denen nützliche Hooks fehlen, ohne dass sie sich in ihren Code einhacken müssen. Füge benutzerdefinierte Felder hinzu und wir fliegen ...

1
maduroblanco

Hallo @ maduroblanco:

Dies wäre sehr viel ein Hack, aber haben Sie versucht, 'option_widget_some-widget' so einzuhängen?

add_filter('option_widget_some-widget','your_option_widget_some_widget');
function your_option_widget_some_widget($value) {
  static $instance = 1;
  select ($instance) {
    case 1: 
      $value = 'foo'; // Return whatever your first one needs
      break;
    case 2: 
      $value = 'bar'; // Return whatever your second one needs 
      break;
    case 3: 
      $value = 'baz';  // Return whatever your third time needs
      break;
  }
  $instance++;
  return $value;
}  

Auch dies ist sehr viel ein Hack, aber es könnte funktionieren? Ich habe diesen Code nicht getestet. Lassen Sie es mich wissen, wenn Sie möchten, dass Sie danach suchen. Beachten Sie, dass der Filtername auf dem Namen der Option basiert. Ändern Sie diesen Namen daher so, dass er mit dem Namen der Option übereinstimmt.

0
MikeSchinkel