angelovcom.net

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

edit-comments.php (13971B)


      1 <?php
      2 /**
      3  * Edit Comments Administration Screen.
      4  *
      5  * @package WordPress
      6  * @subpackage Administration
      7  */
      8 
      9 /** WordPress Administration Bootstrap */
     10 require_once __DIR__ . '/admin.php';
     11 if ( ! current_user_can( 'edit_posts' ) ) {
     12 	wp_die(
     13 		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
     14 		'<p>' . __( 'Sorry, you are not allowed to edit comments.' ) . '</p>',
     15 		403
     16 	);
     17 }
     18 
     19 $wp_list_table = _get_list_table( 'WP_Comments_List_Table' );
     20 $pagenum       = $wp_list_table->get_pagenum();
     21 
     22 $doaction = $wp_list_table->current_action();
     23 
     24 if ( $doaction ) {
     25 	check_admin_referer( 'bulk-comments' );
     26 
     27 	if ( 'delete_all' === $doaction && ! empty( $_REQUEST['pagegen_timestamp'] ) ) {
     28 		$comment_status = wp_unslash( $_REQUEST['comment_status'] );
     29 		$delete_time    = wp_unslash( $_REQUEST['pagegen_timestamp'] );
     30 		$comment_ids    = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = %s AND %s > comment_date_gmt", $comment_status, $delete_time ) );
     31 		$doaction       = 'delete';
     32 	} elseif ( isset( $_REQUEST['delete_comments'] ) ) {
     33 		$comment_ids = $_REQUEST['delete_comments'];
     34 		$doaction    = $_REQUEST['action'];
     35 	} elseif ( isset( $_REQUEST['ids'] ) ) {
     36 		$comment_ids = array_map( 'absint', explode( ',', $_REQUEST['ids'] ) );
     37 	} elseif ( wp_get_referer() ) {
     38 		wp_safe_redirect( wp_get_referer() );
     39 		exit;
     40 	}
     41 
     42 	$approved   = 0;
     43 	$unapproved = 0;
     44 	$spammed    = 0;
     45 	$unspammed  = 0;
     46 	$trashed    = 0;
     47 	$untrashed  = 0;
     48 	$deleted    = 0;
     49 
     50 	$redirect_to = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'spammed', 'unspammed', 'approved', 'unapproved', 'ids' ), wp_get_referer() );
     51 	$redirect_to = add_query_arg( 'paged', $pagenum, $redirect_to );
     52 
     53 	wp_defer_comment_counting( true );
     54 
     55 	foreach ( $comment_ids as $comment_id ) { // Check the permissions on each.
     56 		if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
     57 			continue;
     58 		}
     59 
     60 		switch ( $doaction ) {
     61 			case 'approve':
     62 				wp_set_comment_status( $comment_id, 'approve' );
     63 				$approved++;
     64 				break;
     65 			case 'unapprove':
     66 				wp_set_comment_status( $comment_id, 'hold' );
     67 				$unapproved++;
     68 				break;
     69 			case 'spam':
     70 				wp_spam_comment( $comment_id );
     71 				$spammed++;
     72 				break;
     73 			case 'unspam':
     74 				wp_unspam_comment( $comment_id );
     75 				$unspammed++;
     76 				break;
     77 			case 'trash':
     78 				wp_trash_comment( $comment_id );
     79 				$trashed++;
     80 				break;
     81 			case 'untrash':
     82 				wp_untrash_comment( $comment_id );
     83 				$untrashed++;
     84 				break;
     85 			case 'delete':
     86 				wp_delete_comment( $comment_id );
     87 				$deleted++;
     88 				break;
     89 		}
     90 	}
     91 
     92 	if ( ! in_array( $doaction, array( 'approve', 'unapprove', 'spam', 'unspam', 'trash', 'delete' ), true ) ) {
     93 		$screen = get_current_screen()->id;
     94 
     95 		/** This action is documented in wp-admin/edit.php */
     96 		$redirect_to = apply_filters( "handle_bulk_actions-{$screen}", $redirect_to, $doaction, $comment_ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
     97 	}
     98 
     99 	wp_defer_comment_counting( false );
    100 
    101 	if ( $approved ) {
    102 		$redirect_to = add_query_arg( 'approved', $approved, $redirect_to );
    103 	}
    104 	if ( $unapproved ) {
    105 		$redirect_to = add_query_arg( 'unapproved', $unapproved, $redirect_to );
    106 	}
    107 	if ( $spammed ) {
    108 		$redirect_to = add_query_arg( 'spammed', $spammed, $redirect_to );
    109 	}
    110 	if ( $unspammed ) {
    111 		$redirect_to = add_query_arg( 'unspammed', $unspammed, $redirect_to );
    112 	}
    113 	if ( $trashed ) {
    114 		$redirect_to = add_query_arg( 'trashed', $trashed, $redirect_to );
    115 	}
    116 	if ( $untrashed ) {
    117 		$redirect_to = add_query_arg( 'untrashed', $untrashed, $redirect_to );
    118 	}
    119 	if ( $deleted ) {
    120 		$redirect_to = add_query_arg( 'deleted', $deleted, $redirect_to );
    121 	}
    122 	if ( $trashed || $spammed ) {
    123 		$redirect_to = add_query_arg( 'ids', implode( ',', $comment_ids ), $redirect_to );
    124 	}
    125 
    126 	wp_safe_redirect( $redirect_to );
    127 	exit;
    128 } elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {
    129 	wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
    130 	exit;
    131 }
    132 
    133 $wp_list_table->prepare_items();
    134 
    135 wp_enqueue_script( 'admin-comments' );
    136 enqueue_comment_hotkeys_js();
    137 
    138 if ( $post_id ) {
    139 	$comments_count      = wp_count_comments( $post_id );
    140 	$draft_or_post_title = wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '&hellip;' );
    141 	if ( $comments_count->moderated > 0 ) {
    142 		$title = sprintf(
    143 			/* translators: 1: Comments count, 2: Post title. */
    144 			__( 'Comments (%1$s) on &#8220;%2$s&#8221;' ),
    145 			number_format_i18n( $comments_count->moderated ),
    146 			$draft_or_post_title
    147 		);
    148 	} else {
    149 		$title = sprintf(
    150 			/* translators: %s: Post title. */
    151 			__( 'Comments on &#8220;%s&#8221;' ),
    152 			$draft_or_post_title
    153 		);
    154 	}
    155 } else {
    156 	$comments_count = wp_count_comments();
    157 	if ( $comments_count->moderated > 0 ) {
    158 		$title = sprintf(
    159 			/* translators: %s: Comments count. */
    160 			__( 'Comments (%s)' ),
    161 			number_format_i18n( $comments_count->moderated )
    162 		);
    163 	} else {
    164 		$title = __( 'Comments' );
    165 	}
    166 }
    167 
    168 add_screen_option( 'per_page' );
    169 
    170 get_current_screen()->add_help_tab(
    171 	array(
    172 		'id'      => 'overview',
    173 		'title'   => __( 'Overview' ),
    174 		'content' =>
    175 				'<p>' . __( 'You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the bulk actions.' ) . '</p>',
    176 	)
    177 );
    178 get_current_screen()->add_help_tab(
    179 	array(
    180 		'id'      => 'moderating-comments',
    181 		'title'   => __( 'Moderating Comments' ),
    182 		'content' =>
    183 					'<p>' . __( 'A red bar on the left means the comment is waiting for you to moderate it.' ) . '</p>' .
    184 					'<p>' . __( 'In the <strong>Author</strong> column, in addition to the author&#8217;s name, email address, and blog URL, the commenter&#8217;s IP address is shown. Clicking on this link will show you all the comments made from this IP address.' ) . '</p>' .
    185 					'<p>' . __( 'In the <strong>Comment</strong> column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment.' ) . '</p>' .
    186 					'<p>' . __( 'In the <strong>In response to</strong> column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post.' ) . '</p>' .
    187 					'<p>' . __( 'In the <strong>Submitted on</strong> column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site.' ) . '</p>' .
    188 					'<p>' . __( 'Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more.' ) . '</p>',
    189 	)
    190 );
    191 
    192 get_current_screen()->set_help_sidebar(
    193 	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
    194 	'<p>' . __( '<a href="https://wordpress.org/support/article/comments-screen/">Documentation on Comments</a>' ) . '</p>' .
    195 	'<p>' . __( '<a href="https://wordpress.org/support/article/comment-spam/">Documentation on Comment Spam</a>' ) . '</p>' .
    196 	'<p>' . __( '<a href="https://wordpress.org/support/article/keyboard-shortcuts/">Documentation on Keyboard Shortcuts</a>' ) . '</p>' .
    197 	'<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>'
    198 );
    199 
    200 get_current_screen()->set_screen_reader_content(
    201 	array(
    202 		'heading_views'      => __( 'Filter comments list' ),
    203 		'heading_pagination' => __( 'Comments list navigation' ),
    204 		'heading_list'       => __( 'Comments list' ),
    205 	)
    206 );
    207 
    208 require_once ABSPATH . 'wp-admin/admin-header.php';
    209 ?>
    210 
    211 <div class="wrap">
    212 <h1 class="wp-heading-inline">
    213 <?php
    214 if ( $post_id ) {
    215 	printf(
    216 		/* translators: %s: Link to post. */
    217 		__( 'Comments on &#8220;%s&#8221;' ),
    218 		sprintf(
    219 			'<a href="%1$s">%2$s</a>',
    220 			get_edit_post_link( $post_id ),
    221 			wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '&hellip;' )
    222 		)
    223 	);
    224 } else {
    225 	_e( 'Comments' );
    226 }
    227 ?>
    228 </h1>
    229 
    230 <?php
    231 if ( $post_id ) {
    232 	$post_type_object = get_post_type_object( get_post_type( $post_id ) );
    233 
    234 	if ( $post_type_object ) {
    235 		printf(
    236 			'<a href="%1$s" class="comments-view-item-link">%2$s</a>',
    237 			get_permalink( $post_id ),
    238 			$post_type_object->labels->view_item
    239 		);
    240 	}
    241 }
    242 
    243 if ( isset( $_REQUEST['s'] ) && strlen( $_REQUEST['s'] ) ) {
    244 	echo '<span class="subtitle">';
    245 	printf(
    246 		/* translators: %s: Search query. */
    247 		__( 'Search results for: %s' ),
    248 		'<strong>' . wp_html_excerpt( esc_html( wp_unslash( $_REQUEST['s'] ) ), 50, '&hellip;' ) . '</strong>'
    249 	);
    250 	echo '</span>';
    251 }
    252 ?>
    253 
    254 <hr class="wp-header-end">
    255 
    256 <?php
    257 if ( isset( $_REQUEST['error'] ) ) {
    258 	$error     = (int) $_REQUEST['error'];
    259 	$error_msg = '';
    260 	switch ( $error ) {
    261 		case 1:
    262 			$error_msg = __( 'Invalid comment ID.' );
    263 			break;
    264 		case 2:
    265 			$error_msg = __( 'Sorry, you are not allowed to edit comments on this post.' );
    266 			break;
    267 	}
    268 	if ( $error_msg ) {
    269 		echo '<div id="moderated" class="error"><p>' . $error_msg . '</p></div>';
    270 	}
    271 }
    272 
    273 if ( isset( $_REQUEST['approved'] ) || isset( $_REQUEST['deleted'] ) || isset( $_REQUEST['trashed'] ) || isset( $_REQUEST['untrashed'] ) || isset( $_REQUEST['spammed'] ) || isset( $_REQUEST['unspammed'] ) || isset( $_REQUEST['same'] ) ) {
    274 	$approved  = isset( $_REQUEST['approved'] ) ? (int) $_REQUEST['approved'] : 0;
    275 	$deleted   = isset( $_REQUEST['deleted'] ) ? (int) $_REQUEST['deleted'] : 0;
    276 	$trashed   = isset( $_REQUEST['trashed'] ) ? (int) $_REQUEST['trashed'] : 0;
    277 	$untrashed = isset( $_REQUEST['untrashed'] ) ? (int) $_REQUEST['untrashed'] : 0;
    278 	$spammed   = isset( $_REQUEST['spammed'] ) ? (int) $_REQUEST['spammed'] : 0;
    279 	$unspammed = isset( $_REQUEST['unspammed'] ) ? (int) $_REQUEST['unspammed'] : 0;
    280 	$same      = isset( $_REQUEST['same'] ) ? (int) $_REQUEST['same'] : 0;
    281 
    282 	if ( $approved > 0 || $deleted > 0 || $trashed > 0 || $untrashed > 0 || $spammed > 0 || $unspammed > 0 || $same > 0 ) {
    283 		if ( $approved > 0 ) {
    284 			/* translators: %s: Number of comments. */
    285 			$messages[] = sprintf( _n( '%s comment approved.', '%s comments approved.', $approved ), $approved );
    286 		}
    287 
    288 		if ( $spammed > 0 ) {
    289 			$ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0;
    290 			/* translators: %s: Number of comments. */
    291 			$messages[] = sprintf( _n( '%s comment marked as spam.', '%s comments marked as spam.', $spammed ), $spammed ) . ' <a href="' . esc_url( wp_nonce_url( "edit-comments.php?doaction=undo&action=unspam&ids=$ids", 'bulk-comments' ) ) . '">' . __( 'Undo' ) . '</a><br />';
    292 		}
    293 
    294 		if ( $unspammed > 0 ) {
    295 			/* translators: %s: Number of comments. */
    296 			$messages[] = sprintf( _n( '%s comment restored from the spam.', '%s comments restored from the spam.', $unspammed ), $unspammed );
    297 		}
    298 
    299 		if ( $trashed > 0 ) {
    300 			$ids = isset( $_REQUEST['ids'] ) ? $_REQUEST['ids'] : 0;
    301 			/* translators: %s: Number of comments. */
    302 			$messages[] = sprintf( _n( '%s comment moved to the Trash.', '%s comments moved to the Trash.', $trashed ), $trashed ) . ' <a href="' . esc_url( wp_nonce_url( "edit-comments.php?doaction=undo&action=untrash&ids=$ids", 'bulk-comments' ) ) . '">' . __( 'Undo' ) . '</a><br />';
    303 		}
    304 
    305 		if ( $untrashed > 0 ) {
    306 			/* translators: %s: Number of comments. */
    307 			$messages[] = sprintf( _n( '%s comment restored from the Trash.', '%s comments restored from the Trash.', $untrashed ), $untrashed );
    308 		}
    309 
    310 		if ( $deleted > 0 ) {
    311 			/* translators: %s: Number of comments. */
    312 			$messages[] = sprintf( _n( '%s comment permanently deleted.', '%s comments permanently deleted.', $deleted ), $deleted );
    313 		}
    314 
    315 		if ( $same > 0 ) {
    316 			$comment = get_comment( $same );
    317 			if ( $comment ) {
    318 				switch ( $comment->comment_approved ) {
    319 					case '1':
    320 						$messages[] = __( 'This comment is already approved.' ) . ' <a href="' . esc_url( admin_url( "comment.php?action=editcomment&c=$same" ) ) . '">' . __( 'Edit comment' ) . '</a>';
    321 						break;
    322 					case 'trash':
    323 						$messages[] = __( 'This comment is already in the Trash.' ) . ' <a href="' . esc_url( admin_url( 'edit-comments.php?comment_status=trash' ) ) . '"> ' . __( 'View Trash' ) . '</a>';
    324 						break;
    325 					case 'spam':
    326 						$messages[] = __( 'This comment is already marked as spam.' ) . ' <a href="' . esc_url( admin_url( "comment.php?action=editcomment&c=$same" ) ) . '">' . __( 'Edit comment' ) . '</a>';
    327 						break;
    328 				}
    329 			}
    330 		}
    331 
    332 		echo '<div id="moderated" class="updated notice is-dismissible"><p>' . implode( "<br/>\n", $messages ) . '</p></div>';
    333 	}
    334 }
    335 ?>
    336 
    337 <?php $wp_list_table->views(); ?>
    338 
    339 <form id="comments-form" method="get">
    340 
    341 <?php $wp_list_table->search_box( __( 'Search Comments' ), 'comment' ); ?>
    342 
    343 <?php if ( $post_id ) : ?>
    344 <input type="hidden" name="p" value="<?php echo esc_attr( (int) $post_id ); ?>" />
    345 <?php endif; ?>
    346 <input type="hidden" name="comment_status" value="<?php echo esc_attr( $comment_status ); ?>" />
    347 <input type="hidden" name="pagegen_timestamp" value="<?php echo esc_attr( current_time( 'mysql', 1 ) ); ?>" />
    348 
    349 <input type="hidden" name="_total" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'total_items' ) ); ?>" />
    350 <input type="hidden" name="_per_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'per_page' ) ); ?>" />
    351 <input type="hidden" name="_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg( 'page' ) ); ?>" />
    352 
    353 <?php if ( isset( $_REQUEST['paged'] ) ) { ?>
    354 	<input type="hidden" name="paged" value="<?php echo esc_attr( absint( $_REQUEST['paged'] ) ); ?>" />
    355 <?php } ?>
    356 
    357 <?php $wp_list_table->display(); ?>
    358 </form>
    359 </div>
    360 
    361 <div id="ajax-response"></div>
    362 
    363 <?php
    364 wp_comment_reply( '-1', true, 'detail' );
    365 wp_comment_trashnotice();
    366 require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>