Limitar el widget a una barra lateral registrada específica

4

Tengo un widget que solo quiero que se use con la barra lateral de single.php. Cuando hice referencia al códice para register sidebar no hay una manera de limitar los widgets en la matriz. He investigado con "widget de límite de WordPress para publicar", pero solo son complementos devueltos en mis resultados de búsqueda. Cuando cambio mis parámetros de búsqueda a la página para ver si puedo obtener algo devuelto, me refiero a:

¿Hay alguna forma de que pueda orientar un Widget para que solo se permita el id en el register_sidebar ? No quiero usar un complemento. Quiero aprender a codificarlo correctamente.

EDITAR:

Por comentarios tengo un widget personalizado. que se llama en mi singles.php como <?php get_sidebar( 'foobar' );?> . Cuando alguien está en el administrador, quiero limitar dónde se puede aplicar el widget a:

Así que en la imagen de arriba quiero que solo haya la opción de Post Sidebar . Podría codificar todo esto en el archivo sidebar-foobar.php , pero estoy tratando de aprender a utilizar más los widgets.

    
pregunta DᴀʀᴛʜVᴀᴅᴇʀ 24.09.2015 - 16:38

2 respuestas

2

Mi conocimiento de jquery es casi inexistente, por lo que no estoy seguro de si la solución funciona sugerida por @Howdy_McGee en los comentarios.

De todos modos, solo como cuestión de referencia apropiada, desde el enlace

  

simplemente reemplaza 'your_widget' con el nombre de tu widget en el siguiente código   (dos lugares).

     El evento

'sortreceive' solo se llama cuando el widget se agrega a la barra lateral,   mientras se llama a 'sortstop' cada vez que mueves el widget   Dentro de la barra lateral o eliminarlo.

     

'sortstop' también se llama cuando se agrega el widget, pero por alguna razón   ui.input no está configurado correctamente, así que usé 'sortreceive' para cubrir eso.

jQuery('div.widgets-sortables').bind('sortstop',function(event,ui){
  var id = jQuery(ui.item).attr('id');
  if (id) {
    var widget_type = id.match(/widget-[0-9]+_(.+)-[0-9]+/i)[1];
    if (widget_type == 'your_widget') {
    // do stuff;
    }
  }
})

jQuery('div.widgets-sortables').bind('sortreceive',function(event,ui){
  var id = jQuery(ui.item).attr('id');
  var widget_type = id.match(/widget-[0-9]+_(.+)-__i__/i)[1];
  if (widget_type == 'your_widget') {
    // do stuff;
  }
})

Recientemente he trabajado en una respuesta donde se puede eliminar un widget específico de la gama de widgets de un barra lateral específica. Aquí usamos el filtro sidebars_widgets para eliminar un widget específico de todas las barras laterales, excepto la barra lateral donde debería estar.

En resumen, un widget que se agrega incorrectamente a una barra lateral no se mostrará en el extremo delantero, y tampoco devolverá verdadero con una verificación is_active_sidebar() si ese widget es el único widget agregado a esa barra lateral específica.

Puede probar el siguiente código, solo asegúrese de cambiar los valores del widget y la barra lateral en consecuencia.

add_filter( 'sidebars_widgets', function ( $sidebars_widgets )
{
    // Return our filter when we are on admin screen
    if ( is_admin() )
        return $sidebars_widgets;

    /**
     * Widget we need to target. This should be the name/id we used to register it
     *
     * EXAMPLE
     * parent::__construct(
            'widget_category_posts', 
            _x( 'Category Posts Widget', 'Category Posts Widget' ), 
            [ 'description' => __( 'Display a list of posts from a selected category.' ) ] 
        );
     *
     */
    $custom_widget  = 'widget_category_posts';
    // The sidebar ID we need to run the widget in
    $sidebar_accept = 'sidebar-2';

    // We have come this far, let us wrap this up
    // See if our custom content widget exists is any sidebar, if so, get the array index
    foreach ( $sidebars_widgets as $sidebars_key=>$sidebars_widget ) {
        // Skip the wp_inactive_widgets set, we do not need them
        if ( $sidebars_key == 'wp_inactive_widgets' )
        continue;

        // Only continue our operation if $sidebars_widget are not an empty array
        if ( $sidebars_widget ) {
            foreach ( $sidebars_widget as $k=>$v ) {

                /**
                 * Look for our custom widget, if found, unset it from the $sidebars_widgets array
                 * @see stripos()
                 */
                if ( stripos( $v, $custom_widget ) !== false ) {
                    // If we are on a single page and the sidebar is $sidebar_accept, do not unset
                    if ( is_single() && $sidebars_key == $sidebar_accept )
                        continue;

                    unset( $sidebars_widgets[$sidebars_key][$k] );
                }
            } // endforeach $sidebars_widget
        } // endif $sidebars_widget
    } // endforeach $sidebars_widgets

    return $sidebars_widgets;
});

En conclusión, esto es solo una solución alternativa de PHP que funciona solo para el front-end, pero le insto a que siga buscando una solución jquery adecuada donde un widget solo esté vinculado a una barra lateral específica en el backend. Como dije, la solución jquery del enlace no se ha probado y no sé si realmente funciona

    
respondido por el Pieter Goosen 30.09.2015 - 07:33
1

Como una adición a sus scripts, escribí el script que oculta las barras laterales de la lista desplegable (no pude encontrar esto en ninguna parte). Hice algo de ingeniería inversa del código de Wordpress original de widgets.js para escribir esto.

La solución completa para permitir arrastrar & desplácese solo a las barras laterales especificadas y para filtrar la lista desplegable (solo necesita poner esto en su script de administración de jQuery de documento listo):

function allowedSidebars(allowed)
{
    // this variable will have index of first visible sidebar
    var first = null;
    $('.widgets-chooser-sidebars li').removeClass('widgets-chooser-selected').each(function(index)
    {
        // the data('sidebarId') is set up by wordpress, let's make us of it
        if(-1 === $.inArray($(this).data('sidebarId'), allowed))
        {
            $(this).hide();
        }
        else if(first == null)
        {
            first = index;
        }
    });
    // choose first visible sidebar as default
    if(first != null)
    {
        $('.widgets-chooser-sidebars li').eq(first).addClass('widgets-chooser-selected');
    }
}
$('#available-widgets .widget .widget-title').on('click.widgets-chooser', function()
{
    var widget = $(this).closest('.widget');
    // we want to run our script only on slideDown, not slideUp
    if(!widget.hasClass('widget-in-question'))
    {
        // there is only one sidebar list per all widgets, so we have to show all the sidebars every time
        $('.widgets-chooser-sidebars li').show();
        switch(widget.find('input[name="id_base"]').val())
        {
            // your widgets here
            case 'your_widget_id':
                // allowed sidebars for widget
                allowedSidebars(['your-sidebar-id', 'your-second-sidebar-id']);
            break;
        }
    }
});
// this will make drag and drop working only for specified sidebars
$('.widget').on('dragcreate dragstart', function( event, ui ) {
    var id = $(this).find('input[name="id_base"]').val();
    // probably you may want to change it to switch
    if(id == 'your_widget_id')
    {
        $(this).draggable({
            connectToSortable: '#your-sidebar-id, #your-second-sidebar-id'
        });
    }
});
    
respondido por el icetique 19.05.2016 - 20:34

Lea otras preguntas en las etiquetas