"포스트 잠금 / 편집 잠금"을 비활성화하는 방법은 무엇입니까?


16

다른 사용자가 편집하는 경우 실제로 중요하지 않기 때문에 하나의 게시물 유형에 대해서만이 기능을 비활성화하고 싶습니다 (주요 내용 편집 영역은 Ajaxified이며 관리자가 아닌 사람 만 볼 수 있습니다).

여기에 이미지 설명을 입력하십시오

핵심 기능을 보았지만 진입 점을 찾을 수 없었습니다. 함수 wp_set_post_lock에서을 가로 채야한다고 생각 get_post_meta하지만 공식적인 방법이 있습니까?

그리고 필터에 영향을받지 않는 두 번째 잠금 장치 가 있습니다 wp_check_post_lock_window( 여기에서 birgire로 표시됨 ). 나는 remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );다양한 시점에서 시도했지만 존중하지 않고 계속 뛰고 있습니다 remove_filter.

여기에 이미지 설명을 입력하십시오


1
동기에 대한 설명을 추가했으며이 내용을 다른 화면에서 비 관리자에게 표시하는 솔루션을 염두에두고 있습니다. post_lock그럼에도 불구하고 적절한 고리를 아는 것이 좋을 것 입니다.
brasofilo

답변:


10

@birgire 답변에 추가하여 …

결과

register_post_type()post type support를 등록 할 수 있으며, 나중에add_post_type_support() 지원할 수도 있습니다 . 그리고 그것은 모든 강력한 사용하여 나중에도 확인할 수 있습니다 post_type_supports( $cpt, $feat ).

새로운 기능을 추가하는 일반적인 미니 플러그인

이제 다음 (mu-) 플러그인은 포스트 잠금 기능을 비활성화하는 새로운 종류의 포스트 유형 지원을 확인합니다. 이름은 disabled_post_lock입니다.

<?php
defined( 'ABSPATH' );
/** Plugin Name: (#120179) Maybe Disable Post Type Support */

add_action( 'load-edit.php', 'wpse120179MaybeDisablePostLock' );
function wpse120179MaybeDisablePostLock()
{
    if ( post_type_supports( get_current_screen()->post_type, 'disabled_post_lock' ) )
        add_filter( 'wp_check_post_lock_window', '__return_false' );
}

CPT 당 하나의 플러그인

그런 다음 미니 플러그인을 쉽게 추가하여 자체 또는 타사 플러그인에 대한 게시물 유형 지원을 비활성화 할 수 있습니다 (사용자 메타 테이블의 대역폭과 DB 크기를 절약).

<?php
defined( 'ABSPATH' );
/** Plugin Name: (#120179) Disable Post Type Support for "Beer" Posts */

add_action( 'init', function()
{
    add_post_type_support( 'beer', 'disabled_post_lock' );
} );

두 번째 플러그인이 활성화 되 자마자 우리 맥주 포스트 유형에는 더 이상 포스트 잠금이 없습니다. 이것은 잘 작동하고 플러그인 관리 화면을 통해 쉽게 되돌릴 수 있습니다.

하트 비트 API 비활성화

청취 비트 API를 사용하지 않도록 플러그인 확장 :

<?php
defined( 'ABSPATH' );
/** Plugin Name: (#120179) Maybe Disable Post Type Support */

add_action( 'load-edit.php', 'wpse120179MaybeDisablePostLock' );
function wpse120179MaybeDisablePostLock()
{
    if ( post_type_supports( get_current_screen()->post_type, 'disabled_post_lock' ) )
    {
        add_filter( 'wp_check_post_lock_window', '__return_false' );
        add_filter( 'heartbeat_settings', function( $settings )
        {
            return wp_parse_args( [ 'autostart' => false ], $settings );
        } );
    }
}

이것은 정말 고급스러운 솔루션입니다. admin-ajax.php부품을 어떻게 처리 할 것 입니까 (Q 업데이트 및 A 추가)?
brasofilo

@brasofilo Heartbeat API를 완전히 비활성화하기 위해 편집을 추가했습니다. 어떻게 처리할지 확실하지 않지만 wp.heartbeat.start();JavaScript에서 사용하여 플러그인에서 하트 비트 API를 계속 실행할 수 있습니다 .
kaiser

2
post_type_supports각 사용자 정의 게시물 유형에 대해 이것을 처리하기 위해를 사용하는 것이 좋습니다. 더 많은
투표를

7

편집 잠금 팝업 창 을 제거하려면 다음을 시도하십시오.

add_filter( 'wp_check_post_lock_window', '__return_zero' );

이것이 갈 길인지 확실하지 않지만 소스를 확인하면 wp_check_post_lock() 다음 줄이 있습니다.

...cut...

$time_window = apply_filters( 'wp_check_post_lock_window', 120 );

if ( $time && $time > time() - $time_window && $user != get_current_user_id() )
    return $user;
return false;

...cut...

따라서 아이디어는 조건이 변경 $time_window되도록 변경 하는 if것입니다 false.

최신 정보:

예를 들어 edit.php사용자 정의 게시물 유형 beer을 사용하여 이를 화면 에 적용하려면 다음을 수행하십시오 .

function wpse_120179()
{
    if( 'beer' === get_current_screen()->post_type )
        add_filter( 'wp_check_post_lock_window', '__return_zero' );

}
add_action( 'load-edit.php', 'wpse_120179' );

그런 다음 다음을 추가 할 수 있습니다.

add_action( 'load-post.php', 'wpse_120179' );

post.php화면에서도 제거 할 수 있습니다.

더 파고 ...

기능 _admin_notice_post_locked()은 기능 바로 아래에 정의 되어 wp_set_post_lock()있습니다. 다음 줄이 포함되어 있습니다.

...cut...
if ( ! apply_filters( 'show_post_locked_dialog', true, $post, $user ) )
    return;
...cut...

따라서 show_post_locked_dialog필터를 사용해 볼 수도 있습니다 .

add_filter( 'show_post_locked_dialog', 'wpse_120179_close_dialog', 99, 3 );

function wpse_120179_close_dialog( $show, $post, $user )
{
    if( 'beer' === $post->post_type )
        return FALSE;

    return $show;
}

__return_false()대한 첫 번째 검사가 $time요약 으로 사용되는 것이 더 쉽지 bool TRUE않습니까?
카이저

확인 어쩌면,하지만 확실히 설정하는 방법을 모르겠어요 $timefalse내가 들어갑니다 그래서 $time_window... 대신
birgire

3

내가 사용한 마지막 조합은

# Takes care of the message "Someone else is editing this"
add_action( 'load-edit.php', function()
{
    if( 'beer' === get_current_screen()->post_type )
        add_filter( 'wp_check_post_lock_window', '__return_false' );
});

# Takes care of post.php and the "User has taken over" message
add_filter( 'show_post_locked_dialog', function( $bool, $post, $user )
{
    if( 'beer' === $post->post_type )
        return false;
    return $bool;
}, 
10, 3 );

그러나 다른 테이크가있는 사람이 있다면 사용 가능한 필터의 전체 그림을 실제로 이해하지 못하기 때문에 듣고 싶습니다.

이전에는 load-edit.php+ 사용 load-post.php하여 필터를 제거해야 wp_refresh_post_lock했습니다.

add_action( 'admin_init', function()
{
    if( !defined('DOING_AJAX') || !isset( $_POST['screen_id'] ) || 'beer' !== $_POST['screen_id'] )
        return;

    remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10 );
});

그러나 매번로드 admin_init하는 것이 좋은 생각이 아닙니다.


get_current_screen()->post_type대신 사용하십시오 . 이러한 정보를 검색하는 데 도움이되는 Current Admin Info 라는 멋진 플러그인이 있습니다.
kaiser

1
@kaiser, 여기 내 의도는 Ajax의 심장 박동을 막는 것입니다. 어쩌면 약간의 DOING_AJAX확인을 추가해야합니다 ... 그리고 그것을 이해함에 따라 Ajax에는 없습니다 global $current_screen(로 반환 get_current_screen()).
brasofilo

어쩌면 현재 Dunno. Btw, wp_is_autosave()그 행동에 해당하는지 확실하지 않습니다.
카이저

add_filter( 'show_post_locked_dialog', '__return_false' );함수 _admin_notice_post_locked()에서 도움이 되는지 궁금합니다 .
birgire

@birgire, 아뇨, 작동하지 않았습니다. wp_ajax_heartbeat()체인 load-$hook->을 사용하여 (wp-admin / includes / ajax-actions.php) 를 중지 할 수 없다고 생각합니다 get_current_something(). . . . . 또한, 거기 기능의 3 개 후크,하지만 난 그들을 사용하여 비트를 중지 할 수있는 게 아니에요 (그들은이 $screen_id포스트 유형과 일치하는.
brasofilo

3

나를 위해 일하는 최종 솔루션은 다음과 같습니다. :

function my_remove_post_locked() {
    $current_post_type = get_current_screen()->post_type;   

    // Disable locking for page, post and some custom post type
    $post_types_arr = array(
        'page',
        'post',
        'custom_post_type'
    );

    if(in_array($current_post_type, $post_types_arr)) {
        add_filter( 'show_post_locked_dialog', '__return_false' );
        add_filter( 'wp_check_post_lock_window', '__return_false' );
        wp_deregister_script('heartbeat');
    }
}

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