it-swarm-eu.dev

Omezit počet widgetů v postranních panelech

Pokud používám vlastní widgetized oblast (například zápatí), kde je pouze omezený počet bodů pro widgety (podle designu), mohu omezit počet widgetů, které může uživatel zahrnout do této konkrétní oblasti widgetized? Nezáleží na tom, zda je řešení na zadní straně nebo na přední straně. Děkuji.

16
Jukov

To jsem vyřešil ve Javascriptu. Chcete-li tomu zcela zabránit, měli byste to udělat i na straně serveru, protože widgety můžete upravovat pomocí JavaScriptu zakázáno (vyzkoušejte si to!).

Různé postranní lišty jsou kontrolovány, když jim upustíte widgety nebo je od nich vzdálíte. Pokud se stanou zaplněnými, změní se barva pozadí a položky na nich již nebudete moci přetahovat. Pokud je při spuštění postranní panel již více než plný (protože jste omezili omezení), barva pozadí se změní na červenou. Stále můžete přetahovat widgety z plných widgetů, aby byly znovu prázdné.

One full and one more than full sidebar

Vyzkoušejte prosím tento kód a vyhledejte způsoby, jak přidat nebo odebrat miniaplikace, které jsem zmeškal. "Magie" v kódu jQuery pochází z Aman , který odpověděl na otázku Stack Overflow, kterou jsem o ní napsal .

Javascript:

jQuery( function( $ ) {
    var sidebarLimits = {
        'sidebar-1': 2,
        'sidebar-2': 2,
    };
    var realSidebars = $( '#widgets-right div.widgets-sortables' );
    var availableWidgets = $( '#widget-list' ).children( '.widget' );

    var checkLength = function( sidebar, delta ) {
        var sidebarId = sidebar.id;
        if ( undefined === sidebarLimits[sidebarId] ) {
            return;
        }

        // This is a limited sidebar
        // Find out how many widgets it already has
        var widgets = $( sidebar ).sortable( 'toArray' );
        $( sidebar ).toggleClass( 'sidebar-full', sidebarLimits[sidebarId] <= widgets.length + (delta || 0) );
        $( sidebar ).toggleClass( 'sidebar-morethanfull', sidebarLimits[sidebarId] < widgets.length + (delta || 0) );

        var notFullSidebars = $( 'div.widgets-sortables' ).not( '.sidebar-full' );
        availableWidgets.draggable( 'option', 'connectToSortable', notFullSidebars );
        realSidebars.sortable( 'option', 'connectWith', notFullSidebars );
    }

    // Check existing sidebars on startup
    realSidebars.map( function() {
        checkLength( this );
    } );

    // Update when dragging to this (sort-receive)
    // and away to another sortable (sort-remove)
    realSidebars.bind( 'sortreceive sortremove', function( event, ui ) {
        checkLength( this );
    } );

    // Update when dragging back to the "Available widgets" stack
    realSidebars.bind( 'sortstop', function( event, ui ) {
        if ( ui.item.hasClass( 'deleting' ) ) {
            checkLength( this, -1 );
        }
    } );

    // Update when the "Delete" link is clicked
    $( 'a.widget-control-remove' ).live( 'click', function() {
        checkLength( $( this ).closest( 'div.widgets-sortables' )[0], -1 );
    } );
} );

CSS:

.sidebar-full
{
    background-color: #cfe1ef !important;
}

.sidebar-morethanfull
{
    background-color: #c43 !important;
}

PHP je načte:

$wpse19907_file = $plugin;
add_action( 'admin_enqueue_scripts', 'wpse19907_admin_enqueue_scripts' );
function wpse19907_admin_enqueue_scripts( $hook_suffix )
{
    if ( 'widgets.php' == $hook_suffix ) {
        wp_enqueue_script( 'wpse-19907', plugins_url( 'wpse-19907.js', $GLOBALS['wpse19907_file'] ), array(), false, true );
        wp_enqueue_style( 'wpse-19907', plugins_url( 'wpse-19907.css', $GLOBALS['wpse19907_file'] ) );
    }
}

Pokus o kontrolu na straně serveru (pravděpodobně ještě není úplný):

$wpse19907_sidebars_max_widgets = array(
    'sidebar-1' => 2,
);

add_action( 'sidebar_admin_setup', 'wpse19907_sidebar_admin_setup' );
function wpse19907_sidebar_admin_setup()
{
    if ( ! isset( $_POST['action'] ) || 'save-widget' != $_POST['action'] || empty( $_POST['add_new'] ) ) {
        return;
    }

    // We're adding a new widget to a sidebar
    global $wpse19907_sidebars_max_widgets;
    $sidebar_id = $_POST['sidebar'];

    if ( ! array_key_exists( $sidebar_id, $wpse19907_sidebars_max_widgets ) ) {
        return;
    }

    $sidebar = wp_get_sidebars_widgets();
    $sidebar = isset( $sidebars[$sidebar_id] ) ? $sidebars[$sidebar_id] : array();

    if ( count( $sidebar ) <= $wpse19907_sidebars_max_widgets[$sidebar_id] ) {
        die( 'mx' ); // Length must be shorter than 2, and unique
    }
}
10
Jan Fabry

abych vám pomohl s vaší otázkou, mám návrh. Použijte soubor first-footer-widget-area, který je ve výchozím souboru sidebar-footer.php ve standardním souboru Twenty Ten, jako příklad.

Jako dobrý postup a bezpečné, nejprve zálohovat, aby se zabránilo bolesti hlavy.

Původní kód šablony Twenty Ten pro prezentaci prvního zápatí je následující:

<?php if ( is_active_sidebar( 'first-footer-widget-area' ) ) : ?>
       <div id="first" class="widget-area">
        <ul class="xoxo">
            <?php dynamic_sidebar( 'first-footer-widget-area' ); ?>
        </ul>
       </div><!-- #first .widget-area -->
<?php endif; ?>

Změňme, přidáme nějaký kód s podmínkami, abychom omezili počet widgetů povolených v této oblasti.

<?php if ( is_active_sidebar( 'first-footer-widget-area' ) ) : ?>
    <div id="first" class="widget-area">
    <?php
           $mysidebars = wp_get_sidebars_widgets();
           $total_widgets = count( $mysidebars['first-footer-widget-area'] );
           $limit_allowed=2;
    ?>
        <ul class="xoxo">
            <?php  if ($total_widgets > $limit_allowed) {
                echo 'Your '.$total_widgets.' added widgets goes over the allowed limit: <strong>'.$limit_allowed.'</trong>';
                } else { ?>
            <?php dynamic_sidebar( 'first-footer-widget-area' ); ?>
          <?php }; ?>
        </ul>

        </div><!-- #first .widget-area -->
<?php endif; ?>

Co tento upravený kód provádí:

$mysidebars = wp_get_sidebars_widgets();
$total_widgets = count( $mysidebars['first-footer-widget-area'] );
$limit_allowed=2;

spočítat počet widgetů v tomto bočním panelu a určit určitý povolený limit (nastavený vámi).

...
<?php  if ($total_widgets > $limit_allowed) {
            echo 'Your '.$total_widgets.' added widgets goes over the allowed limit: <strong>'.$limit_allowed.'</trong>';
       } else { ?>
            <?php dynamic_sidebar( 'first-footer-widget-area' ); ?>
<?php }; ?>
...

Pokud byl dosažen limit povolený pro widgety v této oblasti, zobrazí se upozornění, že limit bude zobrazen.

Doufám, že jsem vám pomohl s vaší otázkou.

4
Hans Zimermann

Můžete určit níže uvedené položky, abyste určili počet widgetů.

Funkce:

$mysidebars = wp_get_sidebars_widgets() - zobrazí seznam postranních panelů a widgetů použitých na těchto postranních panelech.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); - zobrazí celkový počet widgetů v my-sidebar-id

Doufám, že to vyřeší vaše pochybnosti.

0
Todd

Interessting Q. V krátkém pohledu jsem toho moc nezjistil, ale tady je odhad: print_r( $GLOBALS['wp_registered_sidebars'] ); nebo print_r( $GLOBALS['sidebars'] ); nebo print_r( $GLOBALS['sidebars_widgets'] ); ...

0
kaiser