메타 박스 드래그를 비활성화 하시겠습니까?


17

메타 상자를 재배치 할 수 없도록이 기능을 비활성화하는 방법을 아는 사람이 있습니까?

답변:


13

나는 같은 문제를 겪었고 구글이 나를 이끌었다. 불행히도 이러한 답변 중 어느 것도 도움이되지 않았지만 궁극적으로 답변을 알아 냈습니다. 매우 쉽습니다!

  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 )을 강화합니다. 또한 메타 박스 핸들의 커서를 이동 커서 대신 표준 마우스 포인터로 전환합니다 ( 아래 의 brasofilo 제공 ).

도움이 되었기를 바랍니다!

편집 : 여기에 다른 조언을 따르고 메타 박스 순서 저장을 비활성화하는 것이 좋습니다. 실수로 다시 활성화되는 오프 기회에 대한 혼동을 방지합니다.

두 번째 수정 : 차세대 (및 향후 Google 검색 자)를 위해이 수정 프로그램은 WordPress 3.3.1에서 테스트되었습니다. 다른 버전과 대화 할 수 없습니다!


Q, IMHO를위한 +1 적은 번거 로움없는 솔루션입니다. 그리고 가중치 무거운 무게의 많은) :::: 내가 추가, 모든 단지 JS를 사용하고 $('.postbox .hndle').css('cursor','default');:::: 재 : 2 차 편집 , 당신은 가까운 장래에 대답을 계속 업데이트해야합니다 : P를
brasofilo

JS에서 CSS를 조작하는 것은 영리합니다! 내 답변에 추가하겠습니다.
Chris Van Patten

이 코드는 현재 WordPress 3.9.1에서 작동합니다. 아주 좋습니다! :)
Philipp

4

가장 빠른 방법은이 기능에 대해 JS를 비활성화하는 것입니다. 그러나 상자의 스타일을 등록 취소하고 마우스 및 메타 상자의 열기 / 닫기 아이콘에 영향을주지 않고 사용자 정의 스타일을 초기화하면 더 좋습니다.

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

특정 사용자 정의 게시물 유형에서 특정 메타 박스에 대해 드래그를 비활성화하려면 어떻게해야합니까?
NetConstructor.com

4
이 작품뿐만 아니라 다른 포스트 상태와 같은 기능 비활성화
fxfuture

나는 그렇다고 생각하지만 이것을 테스트하지는 않습니다. 플러그인 Adminimize를 사용하여 쉽게 숨길 수 있습니다.
bueltge

1
좋은 것! admin_init특정 게시물 유형에서만 어떻게 전달 합니까?
brasofilo

1
처음에는 완벽한 솔루션으로 보였지만 아아-이것은 카테고리 /
택시

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

고마워 Jan-나는 이것을 functions.php에 추가했지만 아무것도하지 않습니까?
fxfuture

@fxfuture : 바보 같은 check_ajax_referer행동은 필터가 아니라 행동입니다. 당신은해야 die()아무것도 반환하지, 스크립트 실행이 종료합니다. 코드를 수정하겠습니다.
Jan Fabry

예, 수정이 작동하지 않습니다. 또는 FireFox 및 Chrome에서 어떤 이유로 페이지를 캐시하고 있습니다. : /
Zack

3

워드 프레스 자바 스크립트는 hhn 제목으로 "hndle"클래스로 드래그 가능한 메타 박스를 식별합니다. 문제가있는 메타 박스를 참조하여 (사용자 정의 메타 박스를 생성하는 경우 식별자를 할당 한 경우) 클래스 이름을 제거하거나 이름을 바꾸어 hndle 클래스를 비활성화하면 이러한 기능을 비활성화 할 수 있습니다. 필자의 경우 .hndle h3으로 레이블이 지정된 여러 구분 기호 유형이 있지만 다른 사람이 이런 식으로 작업을 수행하지는 않습니다. 따라서 아래에서 수행 한 작업을 수행하거나 .find ( '. hndle'). attr ( 'class', '') .... 또는 이와 유사한 것을 사용할 수 있습니다. 이것은 당신이 functions.php 파일에 넣은 .js 파일에 있습니다 (테마 폴더 또는 플러그인 폴더에 있는지 여부). 큐잉은 admin_print_scripts에 의해 호출됩니다.

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

2

나는 또한이 자바 스크립트 해킹을 추가 할 것입니다 :

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

...이 CSS :

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

드래그 앤 드롭과 열기 / 닫기 기능없이 메타 상자를 이용하기 위해이 코드를 사용했습니다.


@bueltge 대답에 좋은 추가는 (나는이 둘의 조합을 사용) - 당신은 또한 jQuery를 비트 건너 뛰고 추가 할 수 있지만 .postbox:hover .handlediv { display:none; }.handlediv 숨기기 위해 CSS에
ptriek

0

나는 질문자가 정답을 선택하지 않는 한,이 질문은 확실하지 않은 것으로 나타났습니다.

Jan은 Ajax를 통해 메타 박스 재정렬을 막는 작업 예제를 제공했지만 다른 사람들은 JS와 관련된 제안을했습니다.

내가 이해하는 한 드래그를 비활성화하면 더 이상 아무것도하지 않습니다. 이를 위해서는 먼저 아약스 저장 동작을 가로채는 기능이 필요하지만 두 번째로 페이지의 다른 곳에서 기능을 중단하지 않고 JS 드래그 앤 드롭을 중지해야합니다. 게시물 유형 또는 특정 메타 박스

Jans 함수와 일부 jQuery를 사용하면 postbox 스크립트가 생성하는 다른 기능을 완전히 죽이지 않고도 할 수 있습니다.

테마 함수 파일 또는 플러그인 파일 용 PHP 코드

적절한 행 중 하나를 주석 해제하여 대기열에 넣습니다.

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

적용 가능한 요소에서 메타 박스 정렬 가능 클래스를 제거하는 매우 기본적인 jquery는 드래그를 방지합니다.

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

보시다시피 코드를 추가하기 위해 1 개의 게시물 유형을 추가했습니다.이 경우 예약하십시오. 그러나 특정 메타 박스에 대해 비활성화 할 가능성을 원한다고 언급했습니다.

주어진 메타 박스에서 클래스를 제거하여 드래그를 방지함으로써 토글 기능 (예 : 메타 박스 제목 토글 기능)을 방지하는 작은 부작용이 몇 가지 있습니다.

그것은 할 수있다 ...

먼저 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 라인의 .

localize 호출 내부의 배열은 비활성화 할 메타 박스를 결정하는 것입니다 .localize 스크립트 함수는 배열의 0 키 인덱스를 제거하기 때문에 비어있는 0 키 항목이 있습니다.

둘째, 위의 조정 된 enqueue 함수에서 참조 된 새 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를 결정하고 비활성화 된 메타 박스를 설정하는 배열로 전달하면됩니다 ( wp_localize_scipt통화 중).

전반적으로 메타 박스를 선택적으로 비활성화하는 것은 단점이 아니라고 생각합니다. 워드 프레스에서 정렬 가능한 초기화 작업을 다시 구성 할 수는 없습니다. 따라서 요소별로 메타 박스 정렬을 비활성화하는 것은 기껏해야 해킹 될 것입니다 (위의 코드는 다음과 같습니다) 그 증거). 이상적으로, 여기에 필요한 것은 정렬 가능한 초기화를 연결하는 WordPress의 작업이지만 현재 우편함 자바 스크립트 (단순 정렬 ​​가능 설정 이상)로 하드 코딩되어 있습니다.

어쨌든, 그것이 원래의 질문을 해결하는 데 도움이되기를 바랍니다.


참고 :이 코드는 현재 버전의 WordPress (3.9.1)에서 더 이상 작동하지 않습니다.
Philipp

0

이전의 모든 답변에 추가하려면 WordPress에서 사용자 정의 위치를로드하지 못하게하려면 다음을 수행해야합니다 ( post모든 게시물 유형으로 대체 ).

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

0

간단한 방법을 찾았습니다. 새로운 찾는 사람이 도움이되기를 바랍니다. 관리자 enqueue 스타일에 CSS 파일을 추가 할 수 있다고 가정하면 CSS를 사용하여 그렇게하고 내 나쁜 영어에 대해 유감스럽게 생각합니다.

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

도움이 되길 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.