Обмежте кількість віджетів на бічних панелях


17

Якщо я використовую власну widgetized область (наприклад, нижній колонтитул), де є лише обмежена кількість плям для віджетів (за дизайном), чи можу я обмежити кількість віджетів, які користувач може включати у цій конкретній widgetized області? Не має значення, чи рішення знаходиться в резервному або передньому кінці. Дякую.

Відповіді:


10

Я вирішив це в Javascript. Якщо ви хочете повністю запобігти цьому, вам слід також зробити це на сервері, оскільки ви можете редагувати віджети з відключеним Javascript (спробуйте це!).

Різні бічні панелі перевіряються, коли ви відпускаєте віджети на них чи подалі від них. Якщо вони стануть повноцінними, колір фону змінюється, і ви більше не можете скидати на них елементи. Якщо при запуску бічна панель вже більш ніж заповнена (оскільки ви посилили обмеження), колір фону стає червоним. Ви все ще можете перетягнути віджети від повних віджетів, щоб зробити їх знову порожніми.

Одна повна і одна більше, ніж повна бічна панель

Перевірте цей код, щоб знайти способи додавання чи видалення віджетів, які я пропустив. "Магія" в коді jQuery походить від Амана , який відповів на запитання про переповнення стека, яке я розмістив про це .

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 для завантаження:

$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'] ) );
    }
}

Спроба перевірки на сервері (можливо, ще не завершена):

$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
    }
}

wow +1 ... чого не вистачає у функції сервера? Не пробував, але зацікавився.
кайзер

Я хотів чогось більшого з боку сервера, але коли я думаю про це, можливо, ти маєш рацію. це необхідно обмежити JS. Я спробую придумати більш надійне рішення, можливо, взагалі заборонити краплі віджетів через JS
Jukov


5

щоб допомогти вам у питанні, я маю пропозицію. Давайте використаємо first-footer-widget-areaподарунок у sidebar-footer.phpфайлі шаблону двадцять десять за замовчуванням як приклад.

Як хороша практика і безпека, по-перше, створити резервну копію, щоб уникнути головних болів.

Оригінальний код шаблону двадцять десять для представлення першого віджета нижнього колонтитулу:

<?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; ?>

Давайте змінимо, додавши якийсь код із умовними умовами, щоб обмежити кількість віджетів, дозволених у цій області.

<?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; ?>

Що робить цей модифікований код:

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

підрахуйте кількість віджетів у цій бічній смузі та встановіть деякий дозволений ліміт (встановлений вами).

...
<?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 }; ?>
...

Якщо межа дозволених віджетів у цій області буде досягнута, то буде показано повідомлення з попередженням про те, що ще буде показано віджет.

Тож сподіваюся, що я допоміг із вашим запитанням.


0

Цікаве питання Q. Не знайшли багато за короткий погляд, але ось здогад: print_r( $GLOBALS['wp_registered_sidebars'] );або print_r( $GLOBALS['sidebars'] );чи print_r( $GLOBALS['sidebars_widgets'] );...


0

Ви можете зробити нижче матеріали, щоб визначити кількість віджетів.

Функція:

$mysidebars = wp_get_sidebars_widgets() - надасть вам список бічних панелей та віджетів, які використовуються на цих бічних панелях.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); - дасть вам кількість загальних віджетів у моєму боковому рядку-ідентифікаторі

Сподіваюся, це вирішить ваші сумніви.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.