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