Fügen Sie der WP_Widget widget () -Methode dynamisch Skripte hinzu

7

Ich habe ein WordPress-Widget, das die Standardkontur wie folgt hat:

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

}}

Ich frage mich, ob es möglich ist, Skripte dynamisch zu einem WordPress-Widget hinzuzufügen ... Ich vermute, dass dies innerhalb der Widget () -Methode b / c erfolgen müsste, die der einzige Ort ist, an dem dynamische Variablen übergeben werden, aber die Problem ist, dass diese Funktion nach dem Hinzufügen von Skripten ausgelöst zu werden scheint.

Danke für deine Gedanken

Mike
quelle
Wie viele verschiedene Skripte gibt es? Nur zwei? Ich habe einmal einen Ansatz verwendet, bei dem ich die Skripte für die Fußzeile registriert, in die Warteschlange gestellt und dann einen automatischen Hook festgelegt habe, um die Skripte aus der Warteschlange zu entfernen, bevor sie angezeigt wurden. Wenn ich das Widget angezeigt habe, habe ich den Dequeue-Hook entfernt. Seltsam, aber es hat funktioniert. Sagen Sie mir, ob das für Sie funktionieren würde, und ich werde den Code nachschlagen.
Jan Fabry
Wenn Sie diesen Code finden können, wäre das großartig. Ich denke, das ist genau das, was ich brauche. Mit der Funktion wp_widget () konnte ich der Fußzeile jedoch keine Skripte hinzufügen. Es hört sich auch so an, als würde dies für Stylesheets nicht funktionieren.
Mike

Antworten:

5

Ich ziehe diesen Code aus meinem Total Widget Control- Plugin, sodass möglicherweise ein oder zwei Fehler auftreten. Ich weiß nicht, lass es mich wissen, wenn es so ist. Dies ist im Grunde der Widget-Code, den ich für alles verwende, was ich erstelle.

    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;

Sobald Sie dies in Ihre Datei functions.php eingefügt haben, können Sie innerhalb von Sekunden neue Widgets deklarieren. Hier ist der Code zum Deklarieren eines neuen Widgets.

    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'
),

)
    ));

Deklarieren Sie die gewünschten Felder für Ihre Widget-Optionen mit dem obigen Array, und Sie sind fast fertig.

Als letztes müssen Sie Ihren Widgets-HTML-Code in Ihren neuen Dateipfad / to / my / widget_view_file.php einfügen

Fügen Sie oben in dieser Widget-Ansichtsdatei den folgenden Code hinzu: <?php extract($args[1]); ?>Dadurch werden drei Variablen aufgeteilt, die Sie verwenden können:

  1. $ Seitenleiste
  2. $ Widget
  3. $ params
E-Commerce-Berater
quelle
4

Dieses Widget stellt alle möglichen erforderlichen Skripte für die Fußzeile in die Warteschlange, setzt jedoch auch einen Haken wp_print_footer_scripts, mit dem die Skripte vor dem Drucken abgemeldet werden, es sei denn, Sie ändern das Array beim Drucken des Widgets.

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 );
            }
        }
    }
}
Jan Fabry
quelle
0

Möchten Sie ein Skript nur dann auslösen, wenn das Widget verwendet wird?

Norcross
quelle
Nein, ich
Mike
Sollten Sie nicht Kommentar verwenden, um Fragen zu stellen ...
Vishal Kumar Sahu
0

Sie können die WP_WidgetKlasse erweitern und Ihre Init-Inhalte zum Konstruktor hinzufügen oder die widget()Methode mit Ihrem geänderten Code überladen . Z.B

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()
    }
}
Rofflox
quelle
Dadurch kann ich der Seite immer noch keine Skripte dynamisch hinzufügen. Ich wäre nicht in der Lage, Skripte / Stil zu Widget () hinzuzufügen, und ich kann immer noch keine Argumente an __construct () senden
Mike
Wie ist die Antwort nützlich?
Vishal Kumar Sahu