it-swarm.com.de

Begrenzen Sie das Widget auf eine bestimmte registrierte Seitenleiste

Ich habe ein Widget, das ich nur mit der single.php-Seitenleiste verwenden darf. Als ich auf den Codex für register sidebar verwies, gibt es keine Möglichkeit, Widgets im Array einzuschränken. Ich habe mit "WordPress Limit Widget zum Posten" recherchiert, aber es handelt sich nur um Plugins, die in meinen Suchergebnissen zurückgegeben werden. Wenn ich meine Suchparameter auf Seite ändere, um zu sehen, ob ich etwas zurückerhalten kann, verweise ich auf:

Kann ich ein Widget so ausrichten, dass es nur für die id im register_sidebar zulässig ist? Ich möchte kein Plugin verwenden. Ich möchte lernen, wie man es richtig codiert.

BEARBEITEN:

Per Kommentar habe ich ein benutzerdefiniertes Widget. das wird in meiner singles.php als <?php get_sidebar( 'foobar' );?> bezeichnet. Wenn jemand im Admin-Bereich ist, möchte ich einschränken, auf welche Bereiche das Widget angewendet werden kann:

 enter image description here 

Im obigen Bild möchte ich also, dass nur die Option Post Sidebar verfügbar ist. Ich könnte das alles in der Datei sidebar-foobar.php fest programmieren, aber ich versuche zu lernen, wie man Widgets besser einsetzt.

Mein jquery Wissen ist noch fast nicht vorhanden, also bin ich nicht sicher, ob die Lösung funktioniert, die von @Howdy_McGee in Kommentaren vorgeschlagen wurde.

Wie auch immer, genau wie beim richtigen Nachschlagen, aus dem Link

ersetzen Sie einfach 'your_widget' durch den Namen Ihres Widgets im folgenden Code (zwei Stellen).

Das Ereignis 'sortreceive' wird nur aufgerufen, wenn das Widget zur Seitenleiste hinzugefügt wird, während 'sortstop' aufgerufen wird, wenn Sie das Widget in der Seitenleiste verschieben oder entfernen.

'sortstop' wird auch aufgerufen, wenn ein Widget hinzugefügt wird, aber aus irgendeinem Grund ist ui.input nicht richtig eingestellt, deshalb habe ich 'sortreceive' verwendet, um das zu behandeln.

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

Ich habe kürzlich an einer Antwort gearbeitet, bei der ein bestimmtes Widget aus dem Array von Widgets aus einer bestimmten Seitenleiste entfernt werden kann. Hier verwenden wir den sidebars_widgets-Filter, um ein bestimmtes Widget aus allen Seitenleisten zu entfernen, mit Ausnahme der Seitenleiste, in der es sich befinden sollte.

Kurz gesagt, ein Widget, das fälschlicherweise zu einer Seitenleiste hinzugefügt wurde, wird nicht im Front-End angezeigt. Bei einer is_active_sidebar()-Prüfung wird auch nicht true zurückgegeben, wenn dieses Widget das einzige Widget ist, das zu dieser bestimmten Seitenleiste hinzugefügt wurde.

Sie können den folgenden Code ausprobieren. Achten Sie lediglich darauf, die Widget- und Sidebar-Werte entsprechend zu ändern.

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

Zusammenfassend ist dies nur eine Umgehung von PHP, die nur für das Front-End funktioniert. Ich möchte Sie jedoch dringend bitten, nach einer geeigneten JQuery-Lösung zu suchen, bei der ein Widget nur an eine bestimmte Seitenleiste im Back-End gebunden ist . Wie gesagt, die jquery-Lösung aus dem Link ist ungetestet und ich weiß nicht, ob das wirklich funktioniert

2
Pieter Goosen

Als Ergänzung zu Ihren Skripten habe ich das Skript geschrieben, das Seitenleisten aus der Dropdown-Liste verbirgt (ich konnte dies nirgendwo finden). Ich habe den ursprünglichen Wordpress-Code widgets.js zurückentwickelt, um dies zu schreiben.

Die Komplettlösung, mit der Sie per Drag & Drop nur auf bestimmte Seitenleisten ziehen und die Dropdown-Liste filtern können (Sie müssen dies nur in Ihr dokumentenfertiges jQuery-Administrationsskript einfügen):

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