Wie können Kommentare für ausstehende und verfasste Posts aktiviert werden?

Ich habe einen benutzerdefinierten Beitragstyp mit aktivierten Kommentaren. Der Kommentarmetabox im Admin erscheint nur, wenn der Beitrag veröffentlicht wird. Ich möchte das Kommentarsystem eher als Diskussion zwischen bestimmten Autoren verwenden (es wird am Frontend versteckt), also möchte ich, dass das Kommentarsystem aktiv ist, wenn die Posts im Entwurf, ausstehend oder veröffentlicht sind. Ist das möglich?

Ich sollte beachten, dass ich das Edit-Flow-Plugin ausprobiert habe, das die “Editorial Comments” -function hat, aber es bringt mehr Probleme mit den Fähigkeiten usw. und passt nicht zu dem, was ich erreichen möchte.

Solutions Collecting From Web of "Wie können Kommentare für ausstehende und verfasste Posts aktiviert werden?"

Folgendes aktiviert das Standardmeta-Feld für draft und pending Posts (im 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 Entwurfspost

Der Fehler wird in /wp-admin/includes/ajax-actions.php , Zeile 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 Schnittstelle viel besser wären. Eine Alternative besteht darin, eine benutzerdefinierte Metabox mit wiederholbaren Feldern zu erstellen, in denen Nachrichten innerhalb des Posts verbleiben können.

Grundlegende Implementierung :

  • Wiederholbare benutzerdefinierte Felder in einer Metabox
  • Wiederholbare Meta-Box

Plugins von Interesse :

  • Benutzerdefinierter Inhaltstyp-Manager
  • Erweiterte benutzerdefinierte Felder

Weitere Entwicklungen

Ich ging voran und machte ein Plugin mit mehr functionen.
Kudos @toscho, die auf einen Einstiegspunkt in der Ajax-Abfrage verweisen.

Private Kommentare für CPT
Aktiviert interne Kommentare für einen bestimmten benutzerdefinierten Posttyp beim Bearbeiten von Entwürfen oder Pending-Posts. Die Kommentare sind nur im Backend sichtbar. Und im Dashboard als intern markiert.