web-dev-qa-db-fra.com

Comment activer les commentaires pour les messages en attente et brouillons?

J'ai un type d'article personnalisé avec les commentaires activés. La metabox de commentaires dans l'administrateur n'apparaît que lorsque l'article est publié. Je veux utiliser le système de commentaires comme une discussion entre certains auteurs (il sera caché au début), donc j'aimerais que le système de commentaires soit actif lorsque les articles sont brouillons, en attente ou publiés. Est-ce possible?

Je dois noter que j'ai essayé le plug-in d'édition de flux qui comporte la fonctionnalité "commentaires éditoriaux", mais il introduit plus de problèmes avec les capacités, etc.

7
Andrew

Ce qui suit active la boîte à méta par défaut pour les articles draft et pending (dans la portfoliopost_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'
            );
    }
}

Mais, nous ne pouvons pas commenter ... error commenting in draft post

L'erreur est produite dans /wp-admin/includes/ajax-actions.php, ligne 736:


Pour corriger cela, l'appel Ajax doit être intercepté avec:

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

Des alternatives

Sur le plan de la rédaction, je comprends que le système de commentaires et l’interface seraient bien meilleurs. Une alternative consiste à créer une méta-boîte personnalisée avec des champs répétables, dans laquelle les messages peuvent être laissés dans le message.

Implémentation de base :

Plugins d’intérêt :


Développements ultérieurs

Je suis allé de l'avant et fait un plugin avec plus de fonctionnalités.
Kudos @toscho, qui a pointé un point d’entrée dans la requête Ajax.

Commentaires privés pour CPT
Active les commentaires internes pour un type de publication personnalisé donné lors de la modification de publications brouillons ou en attente. Les commentaires ne sont visibles que dans le backend. Et marqué comme interne dans le tableau de bord.

6
brasofilo