web-dev-qa-db-fra.com

Créer une variable à partir d'une instance de widget

Est-il possible de renvoyer une instance de widget dans une variable ou un tableau? Je pense à quelque chose comme $widget['title'], $widget['content'] etc.

J'ai essayé d'inspecter la variable global $wp_registered_widgets, mais celle-ci ne semble contenir que des informations utiles pour le rendu du widget, pas le contenu du widget. Je suis également capable de récupérer le widget rendu en utilisant

ob_start(); 
dynamic_sidebar('widgetarea'); 
$sidebar = ob_get_contents();    
ob_end_clean();

Je suppose que je pourrais ensuite analyser une série de noeuds dom avec la méthode jQuery parseHTML. Cependant, cela semble être une façon très compliquée de procéder et je me demande si quelqu'un pourrait suggérer une méthode plus élégante.

1
Keir Lavelle

Où les paramètres de widgets sont-ils stockés?

Les paramètres du widget sont stockés dans la table wp_options. Vous pouvez le récupérer avec

print_r( get_option( 'widget_x' ) );

où x est le paramètre d'entrée $id_base du constructeur de la classe WP_Widget. Si $id_base est vide, il utilise le nom de la classe du widget en minuscules, sans les préfixes: wp_widget ou widget_.

Voici un exemple:

class WP_Widget_Categories extends WP_Widget {

        function __construct() {
                $widget_ops = array( 'classname' => 'widget_categories', 'description' => __( "A list or dropdown of categories." ) );
                parent::__construct('categories', __('Categories'), $widget_ops);
        }

Vous pouvez voir comment le nom de l'option correspondante est créé, ici dans le constructeur de la classe WP_Widget:

function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) {
            $this->id_base = empty($id_base) ? preg_replace( '/(wp_)?widget_/', '', strtolower(get_class($this)) ) : strtolower($id_base);
            $this->name = $name;
            $this->option_name = 'widget_' . $this->id_base;
            $this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) );
            $this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) );
    }

où la méthode de sauvegarde des paramètres est:

   function save_settings($settings) {
            $settings['_multiwidget'] = 1;
            update_option( $this->option_name, $settings );
    }

Exemple:

Widget class name      | Option name
------------------------------------------
WP_Widget_Text         | widget_text
WP_Widget_Archives     | widget_archives
WP_Widget_Calendar     | widget_calendar
WP_Widget_Search       | widget_search    
WP_Widget_Tag_Cloud    | widget_tag_cloud
WP_Widget_Categories   | widget_categories
WP_Widget_Recent_Posts | widget_recent-posts
My_Widget              | widget_my_widget

... etc

Pour les widgets multiples, la valeur de l'option est un tableau avec des numéros d'instance sous forme de clés de tableau.

Exemple: widgets de texte

Pour récupérer toutes les données sauvegardées à partir des widgets de texte, nous pouvons utiliser:

print_r( get_option( 'widget_text' ) );

et obtenez par exemple la sortie suivante:

Array(

   [1] => Array
        (
            [title] => Bacon Ipsum
            [text] => Bacon ipsum dolor sit amet t-bone shankle landjaeger, turkey meatloaf shank swine jowl jerky doner kielbasa salami ham. 
            [filter] => 
        )
   [3] => Array
        (
            [title] => Lorem Ipsum
            [text] => Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
            [filter] => 
        )

    [_multiwidget] => 1
)

J'espère que ça aide.

0
birgire