web-dev-qa-db-fra.com

ajouter dynamiquement des scripts à la méthode WP_Widget widget ()

J'ai un widget wordpress qui a le contour standard comme:

class my_widget extends WP_Widget{

function my_widget(){
   //do setup stuff
}

function form(){
   //do form stuff
}

function update(){
   //do update stuff
}

function widget($args, $instance){
   //how can we dynamically add style and script here

   //this does not work
   if($instance['val'] == 'test'){
      wp_register_script('test', plugins_url('test.js');
      wp_print_scripts('test');
   }else{
      wp_register_script('diff', plugins_url('diff.js');
      wp_print_scripts('diff');
   }
}

}

Je me demande s’il est possible d’ajouter d’une manière ou d’une autre des scripts dynamiques à un widget wordpress ... Je suppose que cela devra se dérouler dans la méthode widget () b/c qui est le seul endroit où les variables dynamiques sont passées, mais le Le problème est que cette fonction semble être activée après l’ajout de scripts.

merci pour vos pensées

7
mike

Ce widget met en file d'attente tous les scripts requis possibles pour le pied de page, mais il définit également un crochet sur wp_print_footer_scripts qui annulera l'enregistrement des scripts avant leur impression, à moins que vous ne changiez le tableau lors de l'impression du widget.

class WPSE16208_Widget extends WP_Widget
{
    // Key is script handle, value is boolean:
    // true if it should be printed, false otherwise
    protected $scripts = array();

    public function __construct()
    {
        parent::__construct( 'wpse16208', 'WPSE 16208 Widget' );

        wp_enqueue_script(
            'wpse16208_a',
            plugins_url( 'a.js', __FILE__ ),
            array(),
            false,
            true
        );
        $this->scripts['wpse16208_a'] = false;
        wp_enqueue_script(
            'wpse16208_b',
            plugins_url( 'b.js', __FILE__ ),
            array(),
            false,
            true
        );
        $this->scripts['wpse16208_b'] = false;

        add_action( 'wp_print_footer_scripts', array( &$this, 'remove_scripts' ) );
    }

    public function widget()
    {
        echo 'My widget';

        $this->scripts['wpse16208_a'] = true;
    }

    public function remove_scripts()
    {
        foreach ( $this->scripts as $script => $keep ) {
            if ( ! $keep ) {
                // It seems dequeue is not "powerful" enough, you really need to deregister it
                wp_deregister_script( $script );
            }
        }
    }
}
4
Jan Fabry

Je retire ce code de monTotal Widget Controlplugin, donc il risque de générer une erreur ou deux. Je ne sais pas, faites le moi savoir si c'est le cas. Ceci est essentiellement le code de widget que j'utilise pour tout ce que je construis.

    if (!function_exists("register_multiwidget")):

/**
 * Register a widget
 * 
 * @param $widget
 */
function register_multiwidget( $widget = null )
{
    static $widgets;
    if (!isset($widgets))
    {
        $widgets = array();
    }

    if (is_null($widget)) return $widgets;
    if (!is_array($widget)) return false;

    $defaults = array(
        'id' => '1',
        'title' => 'Generic Widget',
        'classname' => '',
        'description' => '',
        'width' => 200,
        'height' => 200,
        'fields' => array(),
    );

    $widgets[$widget['id']] = wp_parse_args($widget, $defaults);

    return true;
}

/**
 * Get the registered widgets
 * 
 * @return array
 */
function get_registered_widgets()
{
    return register_multiwidget();
}

/**
 * Initialize the widgets
 * 
 * @return boolean
 */
function init_registered_widgets()
{
    //initialziing variables
    global $wp_widget_factory;
    $widgets = get_registered_widgets();

    //reasons to fail
    if (empty($widgets) || !is_array($widgets)) return false;

    foreach ($widgets as $id => $widget)
    {
        $wp_widget_factory->widgets[$id] =& new Multiple_Widget_Master( $widget );
    }

    return false;
}

/**
 * Multiple Widget Master Class
 * 
 * This class allows us to easily create qidgets without having to deal with the
 * mass of php code.
 * 
 * @author byrd
 * @since 1.3
 */
class Multiple_Widget_Master extends WP_Widget
{

/**
 * Constructor.
 * 
 * @param $widget
 */
function Multiple_Widget_Master( $widget )
{
    $this->widget = apply_filters('twc_widget_setup', $widget);
    $widget_ops = array(
        'classname' => $this->widget['classname'], 
        'description' => $this->widget['description'] 
    );
    $this->WP_Widget($this->widget['id'], $this->widget['title'], $widget_ops);
}

/**
 * Display the Widget View
 * 
 * @example extract the args within the view template
 extract($args[1]); 

 * @param $args
 * @param $instance
 */
function widget($args, $instance)
{
    //initializing variables
    $widget = $this->widget;
    $widget['number'] = $this->number;

    $args = array(
        'sidebar' => $args,
        'widget' => $widget,
        'params' => $instance,
    );

    $show_view = apply_filters('twc_widget_view', $this->widget['show_view'], $widget, $instance, $args);
            ob_start();
            require_once $show_view;
}

/**
 * Update from within the admin
 * 
 * @param $new_instance
 * @param $old_instance
 */
function update($new_instance, $old_instance)
{
    //initializing variables
    $new_instance = array_map('strip_tags', $new_instance);
    $instance = wp_parse_args($new_instance, $old_instance);

    return $instance;
}

/**
 * Display the options form
 * 
 * @param $instance
 */
function form($instance)
{
    //reasons to fail
    if (empty($this->widget['fields'])) return false;
    do_action('twc_widget_before');

    $defaults = array(
        'id' => '',
        'name' => '',
        'desc' => '',
        'type' => '',
        'options' => '',
        'std' => '',
    );

    foreach ($this->widget['fields'] as $field)
    {
        $field = wp_parse_args($field, $defaults);


        if (isset($field['id']) && array_key_exists($field['id'], $instance))
            $meta = attribute_escape($instance[$field['id']]);

        if ($field['type'] != 'custom' && $field['type'] != 'metabox') 
        {
            echo '<p><label for="',$this->get_field_id($field['id']),'">';
        }
        if (isset($field['name']) && $field['name']) echo $field['name'],':';

        switch ($field['type'])
        {
            case 'text':
                echo '<input type="text" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '" value="', $meta ? $meta : $field['std'], '" class="twc_text" />', 
                '<br/><span class="description">', $field['desc'], '</span>';
                break;
            case 'textarea':
                echo '<textarea class="twc_textarea" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '" cols="60" rows="4" style="width:97%">', $meta ? $meta : $field['std'], '</textarea>', 
                '<br/><span class="description">', $field['desc'], '</span>';
                break;
            case 'select':
                echo '<select class="twc_select" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '">';
                foreach ($field['options'] as $option)
                {
                    echo '<option', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>';
                }
                echo '</select>', 
                '<br/><span class="description">', $field['desc'], '</span>';
                break;
            case 'radio':
                foreach ($field['options'] as $option)
                {
                    echo '<input class="twc_radio" type="radio" name="', $this->get_field_name($field['id']), '" value="', $option['value'], '"', $meta == $option['value'] ? ' checked="checked"' : '', ' />', 
                    $option['name'];
                }
                echo '<br/><span class="description">', $field['desc'], '</span>';
                break;
            case 'checkbox':
                echo '<input type="hidden" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '" /> ', 
                     '<input class="twc_checkbox" type="checkbox" name="', $this->get_field_name($field['id']), '" id="', $this->get_field_id($field['id']), '"', $meta ? ' checked="checked"' : '', ' /> ', 
                '<br/><span class="description">', $field['desc'], '</span>';
                break;
            case 'custom':
                echo $field['std'];
                break;
            case 'metabox':
                if ((isset($_REQUEST['action']) && $_REQUEST['action'] == 'edit')
                || (isset($_REQUEST['action']) && $_REQUEST['action'] == 'add' && isset($_REQUEST['addnew'])))
                echo '</div>
                </div>
                <div id="query_view_params" class="postbox">
                    <div class="handlediv" title="Click to toggle"><br></div>
                    <h3 class="hndle">
                        <span>Query View Parameters</span>
                    </h3>
                    <div class="inside">';
                break;
        }

        if ($field['type'] != 'custom' && $field['type'] != 'metabox') 
        {
            echo '</label></p>';
        }
    }
    do_action('twc_widget_after');
    return;
}

}// ends Master Widget Class
endif;

Maintenant, une fois que vous avez collé ceci dans votre fichier functions.php, vous pouvez commencer à déclarer de nouveaux widgets en quelques secondes. Voici le code pour déclarer un nouveau widget.

    register_multiwidget(array(
'id' => 'first-custom-widget',  // Must be slug compatible, and unique, it's used a lot
'title' => __('aaaFirst Widget'),   
'description' => __('This is my description'),  
'classname' => 'st-custom-wi',  
'show_view' => 'path/to/my/widget_view_file.php',
'fields' => array(
array(
    'name' => 'Text box',
    'desc' => 'Enter something here',
    'id' => 'text',
    'type' => 'text',
    'std' => 'Default value 1'
),
array(
    'type' => 'custom',
    'std' => '<hr/>'
),
array(
    'name' => 'Textarea',
    'desc' => 'Enter big text here',
    'id' => 'textarea',
    'type' => 'textarea',
    'std' => 'Default value 2'

),
array(
    'name' => 'Select box',
    'id' => 'select',
    'type' => 'select',
    'options' => array('Option 1', 'Option 2', 'Option 3')
),
array(
    'name' => 'Radio',
    'id' => 'radio',
    'type' => 'radio',
    'options' => array(
    array('name' => 'Name 1', 'value' => 'Value 1'),
    array('name' => 'Name 2', 'value' => 'Value 2')
    )
),
array(
    'name' => 'Checkbox',
    'id' => 'checkbox',
    'type' => 'checkbox'
),

)
    ));

Déclarez les champs que vous souhaitez pour vos options de widget avec le tableau ci-dessus et vous avez presque terminé.

La dernière chose que vous devez faire est de coller le code HTML de vos widgets dans votre nouveau chemin de fichier/vers/mon/widget_view_file.php

En haut de ce fichier de vue de widget, ajoutez le code suivant: <?php extract($args[1]); ?> Ceci divisera trois variables que vous pourrez utiliser:

  1. $ sidebar
  2. $ widget
  3. $ params
3

Souhaitez-vous qu'un script ne se déclenche que lorsque le widget est utilisé?

0
Norcross

Vous pouvez étendre la classe WP_Widget et ajouter vos données init au constructeur ou surcharger la méthode widget() avec votre code modifié. Par exemple.

class WPSE_16208_Widget extends WP_Widget {
    function __construct( $id_base = false, $name, $widget_options = array(), $control_options = array() ) {
        parent::__construct($id_base, $name, $widget_options, $control_options);

        // do your stuff on init
    }

    function widget() {
        // overload WP_Widget::widget()
    }
}
0
rofflox