Wie aktiviere ich Kommentare für ausstehende und Entwurfsbeiträge?

7

Ich habe einen benutzerdefinierten Beitragstyp mit aktivierten Kommentaren. Die Metabox für Kommentare im Administrator wird nur angezeigt, wenn der Beitrag veröffentlicht wird. Ich möchte das Kommentarsystem eher als Diskussion zwischen bestimmten Autoren verwenden (es wird im Frontend ausgeblendet), daher möchte ich, dass das Kommentarsystem aktiv ist, wenn die Beiträge verfasst, ausstehend oder veröffentlicht sind. Ist das möglich?

Ich sollte beachten, dass ich das Bearbeitungsablauf-Plugin ausprobiert habe, das über die Funktion "Redaktionelle Kommentare" verfügt. Es führt jedoch zu weiteren Problemen mit Funktionen usw. und passt nicht zu dem, was ich erreichen möchte.

Andrew
quelle
1
Am Ende habe ich ein Plugin gemacht. Antwort aktualisiert :)
brasofilo

Antworten:

7

Folgendes aktiviert das Standard-Meta-Feld für draftund pendingBeiträge (in 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'
            );
    }
}

Aber wir können nicht kommentieren ... Fehler beim Kommentieren im Beitragsentwurf

Der Fehler wird in /wp-admin/includes/ajax-actions.phpZeile 736 erzeugt:


Um dies zu korrigieren, muss der Ajax-Aufruf abgefangen werden mit:

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

Alternativen

Redaktionell verstehe ich, dass das Kommentarsystem und die Benutzeroberfläche viel besser wären. Eine Alternative besteht darin, ein benutzerdefiniertes Meta-Feld mit wiederholbaren Feldern zu erstellen, in denen Nachrichten im Beitrag hinterlassen werden können.

Grundlegende Implementierung :

Plugins von Interesse :


Weiterentwicklungen

Ich habe ein Plugin mit mehr Funktionen erstellt.
Kudos @toscho, das auf einen Einstiegspunkt in der Ajax-Abfrage zeigte.

Private Kommentare für CPT
Aktiviert interne Kommentare für einen bestimmten benutzerdefinierten Beitragstyp beim Bearbeiten von Entwurfs- oder ausstehenden Beiträgen. Die Kommentare sind nur im Backend sichtbar. Und im Dashboard als intern markiert.

brasofilo
quelle
@kaiser, ja, getestet und funktioniert gut an meinem Ende. Re : $_POST, das ist wörtlich vom Kern. Ich bin ziemlich froh zu sehen, welche Mods du mit diesem Code machen
würdest
Keine Mods :) Brauche es im Moment einfach nicht, war nur an diesem interessiert, da ich ein Projekt im Kopf hatte, bei dem dieses nützlich sein würde.
Kaiser
Hey schöne Arbeit! +10 Ich habe mich an Ihren ursprünglichen Rat gehalten und mithilfe von benutzerdefinierten Meta-Boxen + Ajax im Backend das erstellt, was ich brauchte. Benötigte auch ein Formular am Frontend, um Kommentare einzureichen, damit es auch gut funktionierte. Ich werde das aber überprüfen. Vielen Dank
Andrew
@brasofilo Kümmere dich um mich beim Einstecken. Ich habe eine neue Frage zum Aktivieren des Kommentierens ausstehender Beiträge auf der Front-End-Vorschauseite (anstelle der von dieser Antwort gelösten Beitragsbearbeitungsseite) geöffnet
Christine Cooper