web-dev-qa-db-fra.com

Changer les options du widget via le fichier functions.php en l’absence de hooks

Le problème : modifier les options d'un widget avec une fonction personnalisée dans functions.php, lorsqu'il n'y a pas de points d'ancrage utiles et lorsqu'il y a plusieurs occurrences du même widget (multiwidget).

Cela impliquerait:

  1. Récupération des options de "widget_some-widget" dans la table "wp_options". (L'option renvoyée contenant une chaîne de paramètres (sous forme sérialisée) répétée plusieurs fois correspondant à plusieurs occurrences uniques du même widget.)

  2. Changer la valeur de la troisième occurrence d'une instance d'option appelée some_name, de "ancienne-valeur" à "nouvelle-valeur", et une autre appelée some_other_name, de "une-ancienne-valeur" à "une-nouvelle-valeur". (Il se peut que chaque occurrence du widget ait son propre identifiant dans la chaîne d'options sérialisées qui pourrait être reconnue d'une manière ou d'une autre?)

  3. Mise à jour de la base de données avec les options modifiées

c'est-à-dire quelque chose dans ce sens -

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);

}

La chaîne d'options sérialisées du widget pourrait ressembler à ceci (sans les Ellipsis) -

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;}

Quel type d’approche peut-on adopter (avec le code commenté ci-dessus) pour résoudre ce problème? *

* Cela serait très utile pour contrôler la sortie de widgets tiers (qui ne possèdent pas de hooks utiles) sans avoir besoin de modifier leur code, ni d'en répéter de gros morceaux dans le fichier functions.php.

1
maduroblanco

Après quelques recherches, je suis arrivé à une solution (expliquée dans les commentaires) -

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*

}

* Ajoutez les instructions conditionnelles appropriées pour vérifier que les options existent avant d’obtenir ou de mettre à jour le tableau.

** Ceci est la solution particulière pour les multiwidgets.

C'est tout! Cette petite fonction simple nous permet maintenant de contrôler la sortie de toutes sortes de widgets, simplement en modifiant leurs options par programmation, plutôt que de les modifier manuellement ou en piratant le code. Par exemple, j'ai maintenant un widget tiers sur la page d'accueil d'un blog, qui affiche normalement une liste de publications provenant d'une catégorie fixe définie dans admin, mais dont la catégorie (et son titre) changent périodiquement en fonction d'un paramètre personnalisé. fonction placée dans functions.php. Les applications possibles sont infinies, et cela résout bon nombre des problèmes d'interaction avec des plugins dépourvus de points d'ancrage utiles, sans avoir à pirater leur code. Ajoutez des champs personnalisés au mélange et nous volons ...

1
maduroblanco

Bonjour @ maduroblanco:

Ce serait vraiment un bidouillage, mais avez-vous essayé de raccrocher 'option_widget_some-widget' comme ceci?

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;
}  

Encore une fois, c'est vraiment un bidouillage, mais cela pourrait-il fonctionner? Je n'ai pas testé ce code, alors laissez-moi savoir s'il vous donne l'envie que vous recherchiez. Notez que le nom du filtre est basé sur le nom de l'option. Veillez donc à le modifier pour qu'il corresponde quel que soit le nom de l'option.

0
MikeSchinkel