Làm thế nào để kích hoạt ý kiến ​​cho các bài viết đang chờ xử lý và dự thảo?


7

Tôi có một loại bài tùy chỉnh với ý kiến ​​được kích hoạt. Các bình luận metabox trong quản trị viên chỉ xuất hiện khi bài đăng được xuất bản. Tôi muốn sử dụng hệ thống bình luận như một cuộc thảo luận giữa các tác giả nhất định (nó sẽ bị ẩn ở mặt trước) vì vậy tôi muốn hệ thống bình luận được kích hoạt khi bài viết được soạn thảo, chờ xử lý hoặc xuất bản. Điều này có thể không?

Tôi nên lưu ý rằng tôi đã thử plugin chỉnh sửa luồng có tính năng "nhận xét biên tập", tuy nhiên, nó giới thiệu nhiều vấn đề hơn với khả năng, v.v. và không phù hợp với những gì tôi đang cố gắng đạt được.


1
Tôi đã kết thúc việc làm một plugin. Trả lời cập nhật :)
brasofilo

Câu trả lời:


7

Sau đây cho phép hộp meta mặc định cho draftpendingbài viết (trong portfolio post_type):

add_action( 'admin_init', 'wpse_74018_enable_draft_comments' );

/**
 * Add Comments Meta Box if CPT is 'draft' or 'pending'
 */
function wpse_74018_enable_draft_comments()
{
    if( isset( $_GET['post'] ) ) 
    {
        $post_id = absint( $_GET['post'] ); 
        $post = get_post( $post_id ); 
        if ( 'draft' == $post->post_status || 'pending' == $post->post_status )
            add_meta_box(
                'commentsdiv', 
                __('Comments'), 
                'post_comment_meta_box', 
                'portfolio', // CHANGE FOR YOUR CPT
                'normal', 
                'core'
            );
    }
}

Nhưng, chúng tôi không thể bình luận ... bình luận lỗi trong dự thảo bài

Lỗi được tạo ra /wp-admin/includes/ajax-actions.php, dòng 736:


Để sửa lỗi này, lệnh gọi Ajax phải bị chặn:

add_action( 'admin_init', 'wpse_74018_enable_custom_ajax_comments' );

function wpse_74018_enable_custom_ajax_comments()
{
    add_action( 'wp_ajax_replyto-comment', 'wpse_74018_custom_callback', 0 );
}

/**
 * Copy of wp_ajax_replyto_comment()
 * /wp-admin/includes/ajax-actions.php
 *
 * Adjust the CPT that defines $diff_status   
 */
function wpse_74018_custom_callback( $action ) {
    global $wp_list_table, $wpdb;
    if ( empty( $action ) )
        $action = 'replyto-comment';

    check_ajax_referer( $action, '_ajax_nonce-replyto-comment' );

    set_current_screen( 'edit-comments' );

    $comment_post_ID = (int) $_POST['comment_post_ID'];
    if ( !current_user_can( 'edit_post', $comment_post_ID ) )
        wp_die( -1 );

    $status = $wpdb->get_var( $wpdb->prepare("SELECT post_status FROM $wpdb->posts WHERE ID = %d", $comment_post_ID) );

    if( 'portfolio' == get_post_type( $comment_post_ID ) )
        $diff_status = array('trash');
    else
        $diff_status = array('draft','pending','trash');

    if ( empty($status) )
        wp_die( 1 );
    elseif ( in_array($status, $diff_status ) )
        wp_die( __('ERROR: you are replying to a comment on a draft post.') );

    $user = wp_get_current_user();
    if ( $user->exists() ) {
        $user_ID = $user->ID;
        $comment_author       = $wpdb->escape($user->display_name);
        $comment_author_email = $wpdb->escape($user->user_email);
        $comment_author_url   = $wpdb->escape($user->user_url);
        $comment_content      = trim($_POST['content']);
        if ( current_user_can( 'unfiltered_html' ) ) {
            if ( wp_create_nonce( 'unfiltered-html-comment' ) != $_POST['_wp_unfiltered_html_comment'] ) {
                kses_remove_filters(); // start with a clean slate
                kses_init_filters(); // set up the filters
            }
        }
    } else {
        wp_die( __( 'Sorry, you must be logged in to reply to a comment.' ) );
    }

    if ( '' == $comment_content )
        wp_die( __( 'ERROR: please type a comment.' ) );

    $comment_parent = absint($_POST['comment_ID']);
    $comment_auto_approved = false;
    $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');

    $comment_id = wp_new_comment( $commentdata );
    $comment = get_comment($comment_id);
    if ( ! $comment ) wp_die( 1 );

    $position = ( isset($_POST['position']) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1';

    // automatically approve parent comment
    if ( !empty($_POST['approve_parent']) ) {
        $parent = get_comment( $comment_parent );

        if ( $parent && $parent->comment_approved === '0' && $parent->comment_post_ID == $comment_post_ID ) {
            if ( wp_set_comment_status( $parent->comment_ID, 'approve' ) )
                $comment_auto_approved = true;
        }
    }

    ob_start();
        if ( 'dashboard' == $_REQUEST['mode'] ) {
            require_once( ABSPATH . 'wp-admin/includes/dashboard.php' );
            _wp_dashboard_recent_comments_row( $comment );
        } else {
            if ( 'single' == $_REQUEST['mode'] ) {
                $wp_list_table = _get_list_table('WP_Post_Comments_List_Table');
            } else {
                $wp_list_table = _get_list_table('WP_Comments_List_Table');
            }
            $wp_list_table->single_row( $comment );
        }
        $comment_list_item = ob_get_contents();
    ob_end_clean();

    $response =  array(
        'what' => 'comment',
        'id' => $comment->comment_ID,
        'data' => $comment_list_item,
        'position' => $position
    );

    if ( $comment_auto_approved )
        $response['supplemental'] = array( 'parent_approved' => $parent->comment_ID );

    $x = new WP_Ajax_Response();
    $x->add( $response );
    $x->send();
}

Lựa chọn thay thế

Về mặt biên tập, tôi hiểu rằng hệ thống bình luận và giao diện sẽ tốt hơn nhiều. Một cách khác là tạo một hộp meta tùy chỉnh với các trường có thể lặp lại, trong đó các tin nhắn có thể được để lại trong bài viết.

Thực hiện cơ bản :

Plugin quan tâm :


Sự phát triển xa hơn

Tôi đã đi trước và tạo ra một plugin với nhiều tính năng hơn.
Kudos @toscho, đã chỉ ra một điểm vào trong truy vấn Ajax.

Nhận xét riêng tư cho CPT
Cho phép nhận xét nội bộ cho Loại bài đăng tùy chỉnh nhất định khi Chỉnh sửa bài viết nháp hoặc đang chờ xử lý. Các ý kiến ​​chỉ được nhìn thấy trong phần phụ trợ. Và được đánh dấu là nội bộ trong bảng điều khiển.


@kaiser, vâng, đã thử nghiệm và hoạt động tốt vào cuối của tôi. Re : $_POST, đó là nguyên văn từ cốt lõi. Tôi sẽ rất vui khi thấy những mod bạn làm với mã này :)
brasofilo

Không có mod :) Đơn giản là không cần nó vào lúc này, chỉ quan tâm đến cái đó, vì tôi có một dự án trong đầu, nơi dự án này sẽ tiện dụng.
kaiser

Này làm tốt lắm! +10 Tôi thực sự đã đi với lời khuyên ban đầu của bạn và xây dựng những gì tôi cần bằng cách sử dụng hộp meta tùy chỉnh + ajax trong phần phụ trợ. Cũng cần một hình thức ở mặt trước để gửi ý kiến ​​để làm việc cũng tốt. Tôi sẽ kiểm tra điều này mặc dù. Cảm ơn
Andrew

@brasofilo Nhớ tôi cắm. Tôi đã mở một câu hỏi mới liên quan đến việc cho phép bình luận về các bài đăng đang chờ xử lý trên trang xem trước giao diện người dùng (thay vì trang chỉnh sửa bài đăng mà câu trả lời này giải quyết): wordpress.stackexchange.com/questions/121001/ Thẻ
Christine Cooper
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.