it-swarm.dev

Zakázat přetahování meta boxů?

Každý, kdo ví, jak tuto funkci vypnout, takže meta boxy nelze přemístit?

16
fxfuture

Měl jsem stejný problém a Google mě sem vede. Bohužel žádná z těchto odpovědí nepomohla, ale nakonec jsem na to přišla, a je to docela snadné!

  1. Nejprve si zapište soubor JavaScriptu (tento proces nebudu opakovat; existuje mnoho výukových programů, které mohou tento proces popsat lépe než I). I zahnutý do admin_enqueue_scripts, a to fungovalo dobře.
  2. Zakázáním funkce třídění v tomto souboru JavaScript:

    jQuery(document).ready( function($) {
        $('.meta-box-sortables').sortable({
            disabled: true
        });
    
        $('.postbox .hndle').css('cursor', 'pointer');
    });
    

V zásadě to pouze zakáže jQuery UI Sortable , která ovládá metabox tažení funkce ( postbox.dev.js: 64 ). To také přepne kurzor na popisovač metabox na standardní ukazatel myši namísto kurzoru přesunu (idea s laskavým svolením brasofilo níže).

Snad to pomůže!

Edit: Měla bych dodat, že to asi stojí za to sledovat některé z dalších rad a vypnout ukládání pořadí metaboxů. Zabrání zmatku v případě, že se něco náhodně znovu povolí.

Druhá editace: Ve prospěch budoucích generací (a budoucích vyhledávačů Google) byla tato oprava testována na WordPressu 3.3.1. Nemůžu mluvit s jinými verzemi!

12

Nejrychlejším způsobem je deaktivovat JS pro tuto funkci. Ale myslím, že je lepší, když si také zrušíte registraci stylu pro box a zahájíte vlastní styl bez efektů pro myš a ikonu open/close na meta boxech.

function fb_remove_postbox() {
    wp_deregister_script('postbox');
}
add_action( 'admin_init', 'fb_remove_postbox' );
4
bueltge

I odpověděl na podobnou otázku s návrhem umožňujícím přetažení, ale zakázání uložení nové objednávky na straně serveru. To by vám mohlo poskytnout větší kontrolu a být více do budoucna odolné, protože JavaScript se může rychle měnit, ale protokol pro komunikaci se serverem může zůstat robustnější. Tento příklad zakáže všechny přetažení, ale můžete ho rozšířit, abyste zkontrolovali konkrétní pole nebo meta stránku.

add_action('check_ajax_referer', 'prevent_meta_box_order');
function prevent_meta_box_order($action)
{
   if ('meta-box-order' == $action /* && $wp_user == 'santa claus' */) {
      die('-1');
   }
}
4
Jan Fabry

Wordpress javascript identifikuje draggable metaboxes jejich h3 titul s třídou “hndle”. Je to tak jednoduché, že je můžete zakázat konkrétně odkazem na dotyčný metabox (pokud vytváříte vlastní metaboxy, přidělíte mu identifikátor) a vypnete všechny třídy hndle odstraněním jména třídy nebo jeho přejmenováním. V mém případě mám několik typů oddělovačů, které jsem označil jako .hndle h3, ale je nepravděpodobné, že by to někdo jiný udělal. Takže můžete udělat to, co jsem udělal níže, nebo můžete použít .find ('. Hndle') .trot ('class', '') .... nebo něco podobného. To by šlo v souboru .js, který jste zahrnuli do souboru functions.php (ať už ve složce s motivy nebo ve složce plugins). Enqueueing by se nazýval admin_print_scripts, init nebo jakýkoliv háček, který chcete použít k přidání věcí na vaše stránky admin.

jQuery("#MY_METABOX_ID h3.hndle").each(function(e){
jQuery(this).attr("class", "hndlle");
});
3
Aryan Duntley

Chtěl bych také přidat tento Javascript Hack:

<script type='text/javascript'>
    jQuery(document).ready(function ($) {
        $('.handlediv').remove();
    });
</script>

... a tento CSS:

.postbox .hndle:hover {
    cursor:default;
}

Použil jsem tento kód, abych využil meta boxů, ale bez funkce drag-and-drop a funkcí open/close.

2
Maxime

Chcete-li přidat všechny předchozí odpovědi, pokud chcete také zabránit WordPress v načítání vlastních pozic, následující by měl udělat trik (nahradit post s libovolným typem příspěvku):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );
0
Matthew Boynes

Právě našel jednoduchou cestu, doufám, že by s tím nový hledač pomohl. Za předpokladu, že byste mohli přidat css soubor na admin enqueue stylu, já jen pomocí css to udělat a omlouvám se za mou špatnou angličtinu.

.postbox#your-metabox-id .ui-sortable-handle {
    pointer-events: none;
}

Doufám, že to pomůže.

0
Rahendra Putra K

Všiml jsem si, že tato otázka zůstala nezodpovězena, pokud si žadatel nevybral správnou odpověď.

Jan dal pracovní příklad, jak zastavit přeskupování metaboxů přes Ajax, zatímco jiní dávali návrhy týkající se JS.

Pokud jsem pochopil, že vše, co chcete udělat, je zakázat přetahování, nic víc. K tomu budete potřebovat dvě věci, za prvé funkci pro zachycení akce uložení Ajax, ale za druhé, musíte také zastavit přetahování JS bez zabíjení funkcí kdekoli jinde na stránce, a zároveň to dělat selektivně. typ příspěvku nebo konkrétní metabox.

Pomocí Jans funkce a některé jQuery můžeme udělat, že bez totální zabíjení jiných funkcí postbox skript vytvoří, stejně jako ..\t.

Kód PHP pro soubor s funkcemi tématu nebo soubor pluginu

Nezapomeňte 1 z příslušných řádků, aby se enqueue práce.

add_action( 'admin_enqueue_scripts' , 'disable_metabox_dragging' );
add_action( 'check_ajax_referer',     'disable_metabox_ordering' );

function disable_metabox_dragging( $hook ) {

    if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
        return;

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    // Uncomment the following line if using inside a child theme
    //wp_enqueue_script( 'unsortable-meta', trailingslashit( get_stylesheet_directory_uri() ) . 'unsortable-metaboxes.js', array(), false );

    // Or uncomment the following line if using inside a parent theme
    //wp_enqueue_script( 'unsortable-meta', trailingslashit( get_template_directory_uri() ) . 'unsortable-metaboxes.js', array(), false );

    // Or ncomment the following line if using inside a plugin file
    //wp_enqueue_script( 'unsortable-meta', plugins_url( '/unsortable-metaboxes.js', __FILE__ ), array(), false );
}

function disable_metabox_ordering($action) {

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    if( 'meta-box-order' == $action )
        die;
}

jQuery/JS pro soubor Javascript uvedený výše

Velmi základní jQuery, která odstraňuje metabox třídu z použitelných prvků, což zabraňuje přetažení.

jQuery(document).ready(function($){
    $('.meta-box-sortables').removeClass('meta-box-sortables');
});

Jak vidíte, přidal jsem v příkladu 1 typ příspěvku, abych v tomto případě přidal kód, knihu. Nicméně jste se zmínil, že chcete mít také možnost zakázat ji pro konkrétní metaboxy.

Dá se to udělat, je tu jen několik malých vedlejších efektů, jeden z těch, že odstraněním tříd z daných metaboxů, aby se zabránilo tažení, také zabráníte tomu, aby funkce přepínání fungovala (tj. Funkce metabox přepíná funkce).

To znamená, že to lze udělat ...

Nejprve aktualizujete funkci disable_metabox_dragging ..

function disable_metabox_dragging( $hook ) {

    if( !in_array( $hook, array( 'post.php', 'post-new.php' ) ) )
        return;

    global $post_type;
    if( !in_array( $post_type, array( 'book' ) ) )
        return;

    // Uncomment the following line if using inside a child theme
    // wp_enqueue_script( 'some-unsortables', trailingslashit( get_stylesheet_directory_uri() ) . 'unsortable-somemetaboxes.js', array('postbox') );

    // Or uncomment the following line if using inside a parent theme
    //wp_enqueue_script( 'some-unsortables', trailingslashit( get_template_directory_uri() ) . 'unsortable-somemetaboxes.js', array('postbox') );

    // Or uncomment the following line if using inside a plugin file
    //wp_enqueue_script( 'some-unsortables', plugins_url( '/unsortable-somemetaboxes.js', __FILE__ ), array('postbox') );

    wp_localize_script( 'some-unsortables', 'NonDragMetaboxes', array( 0 => '', 'postcustom', 'postexcerpt' ) );
}

Opět platí, že je třeba odkomentovat řádek wp_enqueue_script.

Pole uvnitř volání localize je to, co určuje, které metaboxy mají být zakázány, položka prázdná 0 klíčová je tam záměrně, protože funkce skriptu localize proudí všechny 0 klíčované indexy v poli.

Za druhé, nový soubor JS odkazoval ve výše uvedené vylepšené funkci enqueue.

jQuery(document).ready(function($){
    // For each item in the JS array created by the localize call
    $.each( NonDragMetaboxes, function(index,value) {

        // Remove postbox class(disables drag) and add stuffbox class(styling is close to the original)
        $( '#' + value ).removeClass('postbox').addClass('stuffbox');

        // Remove redundant handle div
        if( $( '#' + value ).has('.handlediv') )
            $( '#' + value ).children('.handlediv').remove();

        // Remove redundant cursor effect on hover
        if( $( '#' + value ).has('h3') )
            $( '#' + value ).children('h3').css('cursor','default');
    } );
});

Jediné, co potřebujete udělat, je určit ID pro metaboxy, které chcete skrýt, a předat je do pole, které nastaví zakázané metaboxy (ve volání wp_localize_scipt).

Celkově si nemyslím, že selektivně deaktivovat metaboxes je málo nedostatků, je tu prostě žádná podpora pro re-config na akci init v WordPress, takže zakázání třídění metabox na základě element bude hacky v nejlepším případě (můj kód výše je důkazů). V ideálním případě je zde nutná akce v aplikaci WordPress, která má za úkol připojit init, ale to je v současné době hardcoded do poštovního javascriptu (který dělá víc než jen nastavení).

V každém případě doufám, že to pomohlo řešit původní otázku.

0
t31os