ปิดใช้งานการลากกล่องเมตาหรือไม่


17

ใครรู้วิธีปิดการใช้งานฟังก์ชั่นนี้ดังนั้นกล่องเมตาไม่สามารถเปลี่ยนตำแหน่ง?

คำตอบ:


13

ฉันมีปัญหาเดียวกันและ Google ก็พาฉันมาที่นี่ น่าเสียดายที่ไม่มีคำตอบเหล่านี้ช่วย แต่ในที่สุดฉันก็หาคำตอบได้และมันค่อนข้างง่าย!

  1. ก่อนอื่นลงทะเบียนไฟล์ JavaScript (ฉันจะไม่ทำขั้นตอนนี้ใหม่มีบทเรียนมากมายที่สามารถอธิบายขั้นตอนนี้ได้ดีกว่าฉัน) ฉันติดยาadmin_enqueue_scriptsและมันก็ใช้ได้ดี
  2. ปิดการใช้งานฟังก์ชั่นการเรียงลำดับโดยใส่สิ่งนี้ลงในไฟล์ JavaScript นั้น:

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

โดยพื้นฐานแล้วสิ่งนี้จะเป็นการปิดการใช้งาน jQuery UI Sortableซึ่งเพิ่มประสิทธิภาพการทำงานของการลากเมท็อกซ์ ( postbox.dev.js: 64 ) สิ่งนี้จะสลับเคอร์เซอร์บนที่จับ metabox ไปยังตัวชี้เมาส์มาตรฐานแทนเคอร์เซอร์ย้าย (ความคิดความคิดของbrasofiloด้านล่าง)

หวังว่านี่จะช่วยได้!

แก้ไข:ฉันควรเพิ่มว่าน่าจะเป็นไปตามคำแนะนำอื่น ๆ ที่นี่และปิดการใช้งานการบันทึกคำสั่ง metabox มันจะป้องกันความสับสนเมื่อมีโอกาสเกิดขึ้นบางสิ่งบางอย่างถูกเปิดใช้งานอีกครั้งโดยไม่ตั้งใจ

การแก้ไขที่สอง:เพื่อประโยชน์ของคนรุ่นอนาคต (และผู้ค้นหาของ Google ในอนาคต) การแก้ไขนี้ได้รับการทดสอบบน WordPress 3.3.1 ฉันไม่สามารถพูดกับรุ่นอื่นได้!


+1 โซลูชั่นที่ไม่ยุ่งยากน้อยกว่าสำหรับ Q, IMHO แน่นอน และน้ำหนักที่หนักขึ้นมากมาย;) :::: ฉันใช้เฉพาะ JS สำหรับทุกคนเพิ่ม$('.postbox .hndle').css('cursor','default');:::: Re: การแก้ไขครั้งที่ 2คุณจะต้องอัปเดตคำตอบต่อไปในอนาคตอันใกล้: P
brasofilo

การจัดการ CSS จาก JS นั้นฉลาดมาก! ฉันจะเพิ่มเข้าไปในคำตอบของฉัน
Chris Van Patten

รหัสนี้ใช้งานได้กับ WordPress ปัจจุบัน 3.9.1 - ดีมาก! :)
ฟิลิปป์

4

วิธีที่เร็วที่สุดคือเลิกใช้งาน JS สำหรับฟังก์ชั่นนี้ แต่ฉันคิดว่ามันจะดีกว่าเมื่อคุณยกเลิกการลงทะเบียนสไตล์สำหรับกล่องและเริ่มต้นสไตล์ที่กำหนดเองโดยไม่มีเอฟเฟกต์สำหรับเมาส์และไอคอนเปิด / ปิดบนกล่องเมตา

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

ถ้าคุณต้องการปิดการใช้งานการลากเมท็อกซ์เฉพาะกับประเภทโพสต์ที่กำหนดเอง
NetConstructor.com

4
ใช้งานได้ แต่มันยังปิดการใช้งานฟังก์ชั่นอื่น ๆ เช่นสถานะโพสต์
fxfuture

ฉันคิดว่าใช่ แต่ฉันไม่ได้ทดสอบสิ่งนี้ คุณสามารถซ่อนด้วยปลั๊กอินผู้ดูแลระบบเป็นวิธีที่ง่าย
bueltge

1
ทำได้ดีนี่! เราจะจัดส่งนั้นadmin_initเฉพาะบางประเภทโพสต์ได้อย่างไร
brasofilo

1
ดูเหมือนโซลูชั่นที่สมบูรณ์แบบในตอนแรก - แต่อนิจจา - นี่ยังปิดการใช้งานฟังก์ชั่นทั้งหมดสำหรับการเพิ่มหมวดหมู่ / taxonomy ...
ptriek

4

ฉันตอบคำถามที่คล้ายกันพร้อมกับข้อเสนอแนะเพื่ออนุญาตให้ลาก แต่ปิดการใช้งานการบันทึกคำสั่งซื้อใหม่ในฝั่งเซิร์ฟเวอร์ สิ่งนี้อาจช่วยให้คุณควบคุมได้มากขึ้นและเป็นหลักฐานในอนาคตมากขึ้นเนื่องจาก JavaScript สามารถเปลี่ยนแปลงได้อย่างรวดเร็ว แต่โปรโตคอลในการสื่อสารกับเซิร์ฟเวอร์อาจยังคงมีประสิทธิภาพมากขึ้น ตัวอย่างนี้ปิดใช้งานการลากทั้งหมด แต่คุณสามารถขยายเพื่อตรวจสอบกล่องหรือหน้าเมตาเฉพาะของคุณ

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

ขอบคุณ ม.ค. - ฉันเพิ่มสิ่งนี้ไปยังฟังก์ชั่นของฉัน แต่ไม่ได้ทำอะไรเลยเหรอ?
fxfuture

@fxfuture: โง่ฉันcheck_ajax_refererคือการกระทำไม่ใช่ตัวกรอง คุณควรdie()ไปที่นั่นเพื่อสิ้นสุดการทำงานของสคริปต์ไม่ใช่คืนสิ่งใดเลย ฉันจะแก้ไขรหัสของฉัน
Jan Fabry

ใช่การแก้ไขของคุณไม่ทำงาน .. หรือ Firefox และ Chrome กำลังแคชหน้าด้วยเหตุผลบางอย่าง : /
แซค

3

จาวาสคริปต์ wordpress ระบุ metaboxes ที่ลากไปมาได้ตามชื่อ h3 ด้วยคลาส "hndle" มันง่ายพอที่จะปิดการใช้งานเหล่านี้โดยเฉพาะโดยอ้างอิง metabox ในคำถาม (ถ้าคุณกำลังสร้าง metaboxes ที่กำหนดเองคุณจะต้องกำหนดตัวระบุ) และปิดการใช้งานคลาส hndle ใด ๆ โดยการลบชื่อหรือเปลี่ยนชื่อ ในกรณีของฉันฉันมีตัวคั่นหลายประเภทที่ฉันติดป้ายด้วย. hndle h3 แต่ไม่น่าที่ใครจะทำสิ่งนี้ได้ ดังนั้นคุณสามารถทำสิ่งที่ฉันทำด้านล่างหรือคุณอาจใช้. ค้นหา ('. hndle'). attr ('class', '') .... หรือสิ่งที่คล้ายกัน สิ่งนี้จะอยู่ในไฟล์. js ที่คุณจัดคิวไว้ในไฟล์ functions.php ของคุณ (ไม่ว่าจะอยู่ในโฟลเดอร์ธีมหรือโฟลเดอร์ปลั๊กอินของคุณ) ผู้ดูแลระบบจะถูกเรียกโดย admin_print_scripts

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

2

ฉันจะเพิ่ม Javascript Hack นี้ด้วย:

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

... และ CSS นี้:

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

ฉันใช้รหัสนั้นเพื่อใช้ประโยชน์จากกล่องเมตา แต่ไม่มีฟังก์ชั่นการลากและวางและเปิด / ปิด


ยังดีที่คำตอบ @bueltge (ผมใช้การรวมกันของทั้งสอง) - แม้ว่าคุณยังสามารถข้าม jQuery บิตและเพิ่ม.postbox:hover .handlediv { display:none; }ใน CSS เพื่อซ่อน .handlediv
ptriek

0

ฉันสังเกตเห็นว่าคำถามนี้ยังไม่ได้ตอบตราบเท่าที่ผู้ถามไม่เลือกคำตอบที่ถูกต้อง

ม.ค. ให้ตัวอย่างการทำงานของการหยุดการสั่งซื้อ metabox ใหม่ที่ถูกบันทึกไว้ใน Ajax ในขณะที่คนอื่น ๆ ให้คำแนะนำเกี่ยวกับ JS

เท่าที่ฉันเข้าใจทุกสิ่งที่คุณต้องการคือปิดใช้งานการลากไม่มีอะไรเพิ่มเติม ในการทำเช่นนั้นคุณจะต้องใช้สองสิ่งอันดับแรกฟังก์ชั่นที่จะขัดขวางการทำงานของการบันทึก ajax แต่ประการที่สองคุณต้องหยุด JS การลากและวางโดยไม่ฆ่าฟังก์ชันการทำงานที่ใดก็ได้ในหน้าเว็บ โพสต์ประเภทหรือ metabox โดยเฉพาะ

การใช้ฟังก์ชั่น Jans และ jQuery บางอย่างเราสามารถทำได้โดยไม่ต้องฆ่าฟังก์ชั่นอื่น ๆ ทั้งหมดที่สคริปต์สร้างตู้ไปรษณีย์สร้างขึ้นเช่น ..

โค้ด PHP สำหรับไฟล์ฟังก์ชั่นธีมหรือไฟล์ปลั๊กอิน

Uncomment 1 ของบรรทัดที่เหมาะสมเพื่อทำให้งานจัดคิว

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 สำหรับไฟล์ Javascript ที่อ้างถึงในข้างต้น

jquery พื้นฐานมากที่ลบคลาสที่จัดเรียงได้ของ metabox ออกจากองค์ประกอบที่ใช้งานได้ซึ่งจะช่วยป้องกันการลาก

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

ในขณะที่คุณสามารถเห็นฉันได้เพิ่มใน 1 ตัวอย่างประเภทโพสต์เพื่อเพิ่มรหัสหนังสือในกรณีนี้ อย่างไรก็ตามคุณกล่าวถึงความต้องการที่จะมีความเป็นไปได้ของการปิดการใช้งานสำหรับเมท็อกซ์เฉพาะ

สามารถทำได้มีเพียงผลข้างเคียงเล็กน้อยเพียงเล็กน้อยจากการลบคลาสออกจาก metaboxes ที่กำหนดเพื่อป้องกันการลากคุณยังป้องกันไม่ให้ฟังก์ชันสลับทำงาน (เช่นฟังก์ชั่นสลับชื่อ metabox)

ที่กล่าวว่าสามารถทำได้ ...

ก่อนอื่นคุณต้องอัปเดต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' ) );
}

อีกครั้งคุณต้องยกเลิกการใส่เครื่องหมายในwp_enqueue_scriptบรรทัดที่เกี่ยวข้อง

อาร์เรย์ภายในการโทรแบบโลคัลคือสิ่งที่กำหนดว่าจะปิดใช้งาน metaboxes ใดรายการไอเท็ม 0 คีย์ที่ว่างจะมีจุดประสงค์เนื่องจากฟังก์ชันสคริปต์โลคัลไลซ์แถบดัชนี 0 คีย์ใด ๆ ในอาร์เรย์

ประการที่สองไฟล์ JS ใหม่ที่อ้างถึงในฟังก์ชั่นการเข้าคิวปรับแต่งข้างต้น

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

สิ่งเดียวที่คุณต้องทำคือกำหนด ID สำหรับ metaboxes ที่คุณต้องการซ่อนและส่งไปยังอาร์เรย์ที่ตั้งค่า metaboxes ที่ถูกปิดใช้งาน (ในการwp_localize_sciptโทร)

โดยรวมฉันไม่คิดว่าการเลือกปิดการใช้งาน metaboxes นั้นเป็นข้อบกพร่อง แต่ก็ไม่ได้รับการสนับสนุนในการกำหนดค่าการกระทำเริ่มต้นที่เรียงลำดับได้ใหม่ใน WordPress ดังนั้นการปิดใช้งานการเรียงลำดับ metabox ตามองค์ประกอบต่อไป หลักฐานของสิ่งนั้น) ตามหลักการแล้วสิ่งที่จำเป็นในที่นี้คือการกระทำใน WordPress เพื่อเชื่อมโยง init ที่สามารถจัดเรียงได้ แต่ขณะนี้ฮาร์ดโค้ดอยู่ในจาวาสคริปต์ของตู้ไปรษณีย์

ไม่ว่าในกรณีใดฉันหวังว่าจะช่วยตอบคำถามเดิม


หมายเหตุ: รหัสนี้ใช้ไม่ได้กับเวิร์ดเพรสรุ่นปัจจุบัน (3.9.1) อีกต่อไป
ฟิลิปป์

0

หากต้องการเพิ่มคำตอบก่อนหน้านี้ทั้งหมดหากคุณต้องการป้องกันไม่ให้ WordPress โหลดตำแหน่งที่กำหนดเองต่อไปนี้ควรทำเคล็ดลับ (แทนที่postด้วยโพสต์ประเภทใดก็ได้):

add_filter( 'get_user_option_meta-box-order_post', '__return_empty_string' );

0

เพิ่งค้นพบวิธีที่ง่ายหวังว่าผู้สมัครใหม่จะช่วยในเรื่องนี้ สมมติว่าคุณสามารถเพิ่มไฟล์ css ในสไตล์ผู้ดูแลระบบฉันใช้ css เพื่อทำสิ่งนั้นและขอโทษสำหรับภาษาอังกฤษที่ไม่ดีของฉัน

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

หวังว่ามันจะช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.