Kenar Çubuklarındaki Widget sayısını sınırlama


17

Widget'lar (tasarım gereği) için yalnızca sınırlı sayıda noktanın olduğu özel bir widget alan (örneğin altbilgi) kullanırsam, kullanıcının söz konusu widget alanına dahil olabileceği widget sayısını sınırlayabilir miyim? Çözümün arka uçta mı yoksa ön uçta mı olduğu önemli değil. Teşekkür ederim.

Yanıtlar:


10

Bunu Javascript'te çözdüm. Tamamen önlemek istiyorsanız, Javascript devre dışı bırakılmış widget'ları düzenleyebileceğiniz için bunu sunucu tarafında yapmalısınız (deneyin!).

Farklı kenar çubukları, widget'ları onlara bıraktığınızda veya onlardan uzaklaştığınızda kontrol edilir. Doldurulursa, arka plan rengi değişir ve artık öğeleri üzerlerine bırakamazsınız. Başlangıçta kenar çubuğu zaten doluysa (kısıtlamayı sıktığınız için), arka plan rengi kırmızı olur. Yine yeniden boşaltmak için widget'ları tam widget'lardan uzağa sürükleyebilirsiniz.

Bir dolu ve bir tam kenar çubuğundan daha fazlası

Kaçırdığım widget'ları eklemenin veya kaldırmanın yollarını bulmak için lütfen bu kodu test edin. JQuery kodu "sihirli" dan gelir Aman , bu konuda yayınlanan bir yığın taşması soruya .

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

Onları yüklemek için 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'] ) );
    }
}

Sunucu tarafı kontrolü denemesi (muhtemelen henüz tamamlanmamıştır):

$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 ... sunucu tarafı işlevinde ne eksik? Denemedim, ama interessted.
Kaiser

Daha çok sunucu tarafı istedim, ama düşündüğümde belki haklısın. bunun JS tarafından sınırlanması gerekir. Daha sağlam bir çözüm düşünmeye çalışacağım, belki de JS aracılığıyla widget'ların damlalarına izin vermeyeceğim
jigsaw Jukov


5

Sorunuzla ilgili size yardımcı olmak için bir önerim var. Şimdi first-footer-widget-areavarsayılan Yirmi On şablon sidebar-footer.phpdosyasındaki örneği örnek olarak kullanalım .

İyi bir uygulama ve güvenli olarak, önce baş ağrısını önlemek için yedekleyin.

İlk altbilgi widget'ını sunmak için orijinal Yirmi On şablon kodu:

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

Değiştirelim, bu alanda izin verilen widget sayısını sınırlamak için koşullu bazı kodlar ekleyelim.

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

Bu değiştirilmiş kod ne yapar:

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

o kenar çubuğundaki widget sayısını sayın ve izin verilen bir sınırı (sizin belirlediğiniz) saplayın.

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

Bu alandaki widget'lar için izin verilen sınıra ulaşıldıysa, widget'ın diğer sınırın gösterileceğine dair bir uyarı mesajı görüntülenir.

Umarım sorunuza yardımcı olmuşumdur.


0

Interessting S.Kısa bir bakışla pek bir şey bulamadım, ama bir tahmin: print_r( $GLOBALS['wp_registered_sidebars'] );veya print_r( $GLOBALS['sidebars'] );veya print_r( $GLOBALS['sidebars_widgets'] );...


0

Widget sayısını belirlemek için aşağıdaki işlemleri yapabilirsiniz.

İşlev:

$mysidebars = wp_get_sidebars_widgets() - bu kenar çubuklarında kullanılan kenar çubuklarının ve widget'ların listesini verir.

$total_widgets = count( $mysidebars['my-sidebar-id'] ); - kenar çubuğu kimliğimdeki toplam widget'ların sayısını verir

Umarım bu şüphelerinizi çözer.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.