wp_dropdown_pages como una opción en mi widget

5 minutos de lectura

avatar de usuario
Sólido yo

nHe creado un widget para que los usuarios elijan una imagen para mostrar en la barra lateral que se vincula a una página de su elección. Me gustaría que esa página se seleccione a través de wp_dropdown_pages.

Soy bueno para que los usuarios configuren la URL de la imagen, la altura y el ancho, pero guardar el objetivo es donde estoy atascado.

class detc_cta_widget extends WP_Widget {

// Constructor //

function detc_cta_widget() {
    $widget_ops = array( 'classname' => 'detc_cta_widget', 'description' => 'Displays a Phone CTA' ); // Widget Settings
    $control_ops = array( 'id_base' => 'detc_cta_widget' ); // Widget Control Settings
    $this->WP_Widget( 'detc_cta_widget', 'DETC - CTA', $widget_ops, $control_ops ); // Create the widget
}

// Extract Args //

    function widget($args, $instance) {
        extract( $args );
        $title  = apply_filters('widget_title', $instance['title']); // the widget title
        $img_source     = $instance['img_source']; // CTA Image Source URL
        $img_height     = $instance['img_height']; // CTA Image Height
        $img_width  = $instance['img_width']; // CTA Image Width
        $link_target    = $instance['link_target']; // CTA Link Target

// Before widget //

        echo $before_widget;

// Title of widget //

        if ( $title ) { echo $before_title . $title . $after_title; }

// Widget output //
        ?>
        <div>
        <a href="https://stackoverflow.com/questions/9422624/<?php echo $link_target ?>"><img src="<?php echo $img_source ?>" height="<?php echo $img_height ?>" width="<?php echo $img_width ?>"></a>
        </div>
        <?php

// After widget //

        echo $after_widget;

    }

// Update Settings //

    function update($new_instance, $old_instance) {
        $instance['title'] = strip_tags($new_instance['title']);
        $instance['img_source'] = strip_tags($new_instance['img_source']);
        $instance['img_height'] = strip_tags($new_instance['img_height']);
        $instance['img_width'] = strip_tags($new_instance['img_width']);
        $instance['link_target'] = strip_tags($new_instance['link_target']);
        return $instance;
    }

// Widget Control Panel //

    function form($instance) {

    $defaults = array( 'title' => '','img_source' => 'wp-content/themes/corvius/images/cta_img.png','img_height' => '50','img_width' => '200','link_target' => 'cta.php');
    $instance = wp_parse_args( (array) $instance, $defaults ); ?>

    <p>
        <label for="<?php echo $this->get_field_id('title'); ?>">Title:</label>
        <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>'" type="text" value="<?php echo $instance['title']; ?>" />
    </p>
    <p>
        <label for="<?php echo $this->get_field_id('img_source'); ?>"><?php _e('CTA Image URL:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('img_source'); ?>" name="<?php echo $this->get_field_name('img_source'); ?>" type="text" value="<?php echo $instance['img_source']; ?>" />
    </p>
    <p>
        <label for="<?php echo $this->get_field_id('img_height'); ?>"><?php _e('CTA Image Height:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('img_height'); ?>" name="<?php echo $this->get_field_name('img_height'); ?>" type="text" value="<?php echo $instance['img_height']; ?>" />
    </p>
    <p>
        <label for="<?php echo $this->get_field_id('img_width'); ?>"><?php _e('CTA Image Width:'); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id('img_width'); ?>" name="<?php echo $this->get_field_name('img_width'); ?>" type="text" value="<?php echo $instance['img_width']; ?>" />
    </p>
    <p>
        <label for="<?php echo $this->get_field_id('link_target'); ?>"><?php _e('CTA Link Target:'); ?></label>
        <?php wp_dropdown_pages(); ?>
    </p>



    <?php }


}
// End class detc_cta_widget

add_action('widgets_init', create_function('', 'return register_widget("detc_cta_widget");'));
?>

Así es como se ve el área de opciones de widgets:

ingrese la descripción de la imagen aquí

ACTUALIZACIÓN: @Simon He cambiado el código del Panel de control a:

    <p>
        <label for="<?php echo $this->get_field_id('link_target'); ?>"><?php _e('CTA Link Target:'); ?></label>
        <?php wp_dropdown_pages(array('id' => $this->get_field_id('link_target'),'name' => $this->get_field_name('link_target'))); ?>
    </p>

Pero todavía no hay éxito en la selección que se guarda.

avatar de usuario
Simón

tienes que dar wp_dropdown_pages un atributo de nombre propio (y id sería bueno para su label elemento). Esto debería hacer:

wp_dropdown_pages(array(
    'id' => $this->get_field_id('link_target'),
    'name' => $this->get_field_name('link_target'),
    'selected' => $instance['link_target'],
);

  • He actualizado la pregunta, ¿tal vez no entendí tu respuesta?

    – Sólido I

    24 de febrero de 2012 a las 0:30

  • Ah, me perdí el select llave. En realidad, su selección se estaba guardando, simplemente no se mostraba. ¡Respuesta actualizada!

    – Simón

    24 de febrero de 2012 a las 9:52

  • Buen trabajo, “seleccionado” devuelve la identificación de la página, lo cual no fue un problema, incluso aunque cambié mis enlaces permanentes para usar títulos de página. Para aquellos a quienes les gustaría seguir, asegúrese de configurar su ancla href en “?page_id=“

    – Sólido I

    27 de febrero de 2012 a las 22:55

  • Aún mejor: usa the_permalink($link_target) y la URL generada reflejará su configuración de enlace permanente.

    – Simón

    28 de febrero de 2012 a las 12:25

Creo que este código funcionaría mejor.

wp_dropdown_pages(array(
'id' => $this->get_field_id('link_target'),
'name' => $this->get_field_name('link_target'),
'selected' => $link_target,
));

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad