Làm cách nào để vô hiệu hóa Khóa Post Post / Chỉnh sửa khóa Khóa?


16

Tôi muốn vô hiệu hóa điều này chỉ cho một Loại bài đăng, vì nó không thực sự quan trọng nếu có người dùng khác chỉnh sửa nó (khu vực chỉnh sửa nội dung chính là Ajaxified và những người không phải quản trị viên chỉ có thể thấy điều đó).

nhập mô tả hình ảnh ở đây

Tôi đã xem xét các chức năng cốt lõi nhưng không thể tìm thấy điểm vào. Từ chức năng wp_set_post_locktôi đoán rằng tôi phải chặn nó get_post_meta, nhưng có cách nào chính thức để làm điều đó không?

Và có một khóa thứ hai dường như không bị ảnh hưởng bởi bộ lọc wp_check_post_lock_window( như được hiển thị bởi birgire , ở đây trong Câu trả lời). Tôi đã thử remove_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 );ở nhiều điểm nhưng nó cứ đập mà không tôn trọng remove_filter.

nhập mô tả hình ảnh ở đây


1
Tôi đã thêm một sự làm rõ về các động cơ và nó mang đến một giải pháp cho tâm trí: hiển thị nội dung này cho những người không phải là quản trị viên trong một màn hình khác. Nhưng post_lockdù sao cũng sẽ rất hay khi biết một cái móc thích hợp .
brasofilo

Câu trả lời:


10

Là một bổ sung cho câu trả lời @birgire

Kết quả

register_post_type()cho phép đăng ký hỗ trợ loại bài đăng, cũng có thể được thực hiện sau này khi sử dụngadd_post_type_support() . Và điều đó có thể được kiểm tra thậm chí sau này bằng cách sử dụng tất cả hùng mạnh post_type_supports( $cpt, $feat ).

Một plugin mini nói chung có thêm một tính năng mới

Bây giờ plugin (mu-) sau đây kiểm tra loại hỗ trợ loại bài đăng mới vô hiệu hóa tính năng khóa bài. Nó được đặt tên 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' );
}

Một plugin cho mỗi CPT

Sau đó, chúng tôi có thể dễ dàng thêm các plugin nhỏ để vô hiệu hóa hỗ trợ loại bài đăng cho các plugin của riêng chúng tôi hoặc của bên thứ ba (tiết kiệm cho chúng tôi một số băng thông và kích thước DB trong bảng meta người dùng):

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

Ngay sau khi plugin thứ hai được kích hoạt, loại bài đăng bia của chúng tôi không còn khóa bài nữa. Điều này sẽ hoạt động tốt và có thể dễ dàng hoàn nguyên thông qua màn hình quản trị bổ trợ.

Vô hiệu hóa API nhịp tim

Mở rộng plugin để vô hiệu hóa API Hearbeat:

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

Đây là một giải pháp thực sự đẳng cấp , bạn sẽ xử lý admin-ajax.phpphần như thế nào (Q đã cập nhật và thêm A)?
brasofilo

@brasofilo Tôi đã thêm một chỉnh sửa để tắt hoàn toàn API Heartbeat. Không chắc chắn về cách bạn muốn xử lý việc đó, nhưng bạn vẫn có thể chạy API nhịp tim trong các plugin bằng cách sử dụng wp.heartbeat.start();JavaScript của mình.
kaiser

2
đó là ý tưởng tuyệt vời bằng cách sử dụng post_type_supportsđể xử lý việc này cho từng loại bài đăng tùy chỉnh, tôi ước tôi có thể cung cấp cho bạn nhiều ưu đãi hơn ;-)
birgire

7

Để xóa cửa sổ bật lên khóa chỉnh sửa , bạn có thể thử:

add_filter( 'wp_check_post_lock_window', '__return_zero' );

Tôi không chắc đây có phải là con đường để đi không, nhưng tôi đã kiểm tra nguồn wp_check_post_lock() và ở đó chúng tôi có những dòng này:

...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...

Vì vậy, ý tưởng là để thay đổi $time_windowđể ifđiều kiện là false.

Cập nhật:

Để áp dụng điều này trên edit.phpmàn hình, với loại bài đăng tùy chỉnh beerchẳng hạn:

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

Và sau đó chúng ta có thể thêm:

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

để loại bỏ nó cho post.phpmàn hình là tốt.

Đào thêm ...

Hàm _admin_notice_post_locked()được định nghĩa ngay bên dưới wp_set_post_lock()hàm. Nó chứa các dòng này:

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

vì vậy người ta cũng có thể thử show_post_locked_dialogbộ lọc:

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

Sẽ không dễ dàng hơn nếu chỉ sử dụng __return_false()thay vì kiểm tra đầu tiên $timechỉ là tổng hợp như một bool TRUE?
kaiser

ok có thể, nhưng tôi không chắc chắn làm thế nào để thiết lập $timeđể falsevì vậy tôi đã đi để $time_windowthay vào đó ...
birgire

3

Sự kết hợp cuối cùng tôi đã kết thúc sử dụng là

# 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 );

nhưng nếu có ai đó thực hiện, tôi rất muốn nghe, vì tôi không thực sự hiểu toàn bộ bức tranh về các bộ lọc có sẵn.

Trước đây, bằng cách sử dụng load-edit.php+ load-post.php, tôi đã phải xóa bộ lọc wp_refresh_post_lockbằng:

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

nhưng tải ở mọi thứ admin_initdường như không phải là một ý tưởng tốt.


Vui lòng sử dụng get_current_screen()->post_typethay thế. Đây là một plugin đẹp có tên Thông tin quản trị viên hiện tại để hỗ trợ bạn truy xuất thông tin đó.
kaiser

1
@kaiser, ý định của tôi ở đây là chặn nhịp tim cho Ajax, có lẽ tôi nên thêm một số DOING_AJAXkiểm tra ... Và theo tôi hiểu, Ajax không có global $current_screen(được trả về get_current_screen()).
brasofilo

À, có lẽ. Dunno tại thời điểm này. Btw, có wp_is_autosave()- không chắc chắn nếu điều đó giải thích cho bất kỳ hành động nào.
kaiser

Tôi tự hỏi nếu add_filter( 'show_post_locked_dialog', '__return_false' );, từ các chức năng _admin_notice_post_locked(), là bất kỳ trợ giúp?
bạch dương

@birgire, không, không hoạt động. Tôi nghĩ rằng không thể dừng wp_ajax_heartbeat()(wp-admin / gồm / ajax-hành động.php) bằng cách sử dụng chuỗi load-$hook-> get_current_something(). . . . . Ngoài ra, có 3 móc trong chức năng đó, nhưng tôi không thể dừng nhịp bằng cách sử dụng chúng (và chúng có $screen_id, phù hợp với loại bài đăng.
brasofilo

3

Đây là giải pháp cuối cùng phù hợp với tôi. :

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');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.