if ( 1 == get_option('comment_moderation') )
return false; // If moderation is set to manual
- if ( get_option('comment_max_links') && preg_match_all("/<[Aa][^>]*[Hh][Rr][Ee][Ff]=['\"]([^\"'>]+)[^>]*>/", apply_filters('comment_text',$comment), $out) >= get_option('comment_max_links') )
- return false; // Check # of external links
+ // Check # of external links
+ if ( $max_links = get_option( 'comment_max_links' ) ) {
+ $num_links = preg_match_all( '/<a [^>]*href/i', apply_filters( 'comment_text', $comment ), $out );
+ $num_links = apply_filters( 'comment_max_links_url', $num_links, $url ); // provide for counting of $url as a link
+ if ( $num_links >= $max_links )
+ return false;
+ }
$mod_keys = trim(get_option('moderation_keys'));
if ( !empty($mod_keys) ) {
if ( 'trackback' == $comment_type || 'pingback' == $comment_type ) { // check if domain is in blogroll
$uri = parse_url($url);
$domain = $uri['host'];
- $uri = parse_url( get_option('home') );
+ $uri = parse_url( home_url() );
$home_domain = $uri['host'];
if ( $wpdb->get_var($wpdb->prepare("SELECT link_id FROM $wpdb->links WHERE link_url LIKE (%s) LIMIT 1", '%'.$domain.'%')) || $domain == $home_domain )
return true;
function get_comments( $args = '' ) {
global $wpdb;
- $defaults = array('status' => '', 'orderby' => 'comment_date_gmt', 'order' => 'DESC', 'number' => '', 'offset' => '', 'post_id' => 0);
+ $defaults = array(
+ 'author_email' => '',
+ 'ID' => '',
+ 'karma' => '',
+ 'number' => '',
+ 'offset' => '',
+ 'orderby' => '',
+ 'order' => 'DESC',
+ 'parent' => '',
+ 'post_ID' => '',
+ 'post_id' => 0,
+ 'status' => '',
+ 'type' => '',
+ 'user_id' => '',
+ );
$args = wp_parse_args( $args, $defaults );
extract( $args, EXTR_SKIP );
$order = ( 'ASC' == $order ) ? 'ASC' : 'DESC';
- $orderby = 'comment_date_gmt'; // Hard code for now
+ if ( ! empty( $orderby ) ) {
+ $ordersby = is_array($orderby) ? $orderby : preg_split('/[,\s]/', $orderby);
+ $ordersby = array_intersect(
+ $ordersby,
+ array(
+ 'comment_agent',
+ 'comment_approved',
+ 'comment_author',
+ 'comment_author_email',
+ 'comment_author_IP',
+ 'comment_author_url',
+ 'comment_content',
+ 'comment_date',
+ 'comment_date_gmt',
+ 'comment_ID',
+ 'comment_karma',
+ 'comment_parent',
+ 'comment_post_ID',
+ 'comment_type',
+ 'user_id',
+ )
+ );
+ $orderby = empty( $ordersby ) ? 'comment_date_gmt' : implode(', ', $ordersby);
+ } else {
+ $orderby = 'comment_date_gmt';
+ }
$number = absint($number);
$offset = absint($offset);
$number = '';
}
+ $post_where = '';
+
if ( ! empty($post_id) )
- $post_where = $wpdb->prepare( 'comment_post_ID = %d AND', $post_id );
- else
- $post_where = '';
+ $post_where .= $wpdb->prepare( 'comment_post_ID = %d AND ', $post_id );
+ if ( '' !== $author_email )
+ $post_where .= $wpdb->prepare( 'comment_author_email = %s AND ', $author_email );
+ if ( '' !== $karma )
+ $post_where .= $wpdb->prepare( 'comment_karma = %d AND ', $karma );
+ if ( 'comment' == $type )
+ $post_where .= "comment_type = '' AND ";
+ elseif ( ! empty( $type ) )
+ $post_where .= $wpdb->prepare( 'comment_type = %s AND ', $type );
+ if ( '' !== $parent )
+ $post_where .= $wpdb->prepare( 'comment_parent = %d AND ', $parent );
+ if ( '' !== $user_id )
+ $post_where .= $wpdb->prepare( 'user_id = %d AND ', $user_id );
$comments = $wpdb->get_results( "SELECT * FROM $wpdb->comments WHERE $post_where $approved ORDER BY $orderby $order $number" );
wp_cache_add( $cache_key, $comments, 'comment' );
/**
* Add meta data field to a comment.
*
- * @since 2.9
+ * @since 2.9.0
* @uses add_metadata
* @link http://codex.wordpress.org/Function_Reference/add_comment_meta
*
* value, will keep from removing duplicate metadata with the same key. It also
* allows removing all metadata matching key, if needed.
*
- * @since 2.9
+ * @since 2.9.0
* @uses delete_metadata
* @link http://codex.wordpress.org/Function_Reference/delete_comment_meta
*
/**
* Retrieve comment meta field for a comment.
*
- * @since 2.9
+ * @since 2.9.0
* @uses get_metadata
* @link http://codex.wordpress.org/Function_Reference/get_comment_meta
*
*
* If the meta field for the comment does not exist, it will be added.
*
- * @since 2.9
+ * @since 2.9.0
* @uses update_metadata
* @link http://codex.wordpress.org/Function_Reference/update_comment_meta
*
}
/**
- * Validates whether this comment is allowed to be made or not.
+ * Validates whether this comment is allowed to be made.
*
* @since 2.0.0
* @uses $wpdb
* @uses apply_filters() Calls 'pre_comment_approved' hook on the type of comment
+ * @uses apply_filters() Calls 'comment_duplicate_trigger' hook on commentdata.
* @uses do_action() Calls 'check_comment_flood' hook on $comment_author_IP, $comment_author_email, and $comment_date_gmt
*
* @param array $commentdata Contains information on the comment
$dupe .= "OR comment_author_email = '$comment_author_email' ";
$dupe .= ") AND comment_content = '$comment_content' LIMIT 1";
if ( $wpdb->get_var($dupe) ) {
+ do_action( 'comment_duplicate_trigger', $commentdata );
if ( defined('DOING_AJAX') )
die( __('Duplicate comment detected; it looks as though you’ve already said that!') );
$total = 0;
$approved = array('0' => 'moderated', '1' => 'approved', 'spam' => 'spam', 'trash' => 'trash', 'post-trashed' => 'post-trashed');
$known_types = array_keys( $approved );
- foreach( (array) $count as $row_num => $row ) {
+ foreach ( (array) $count as $row ) {
// Don't count post-trashed toward totals
if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] )
$total += $row['num_comments'];
}
/**
- * Removes comment ID and maybe updates post comment count.
+ * Trashes or deletes a comment.
+ *
+ * The comment is moved to trash instead of permanently deleted unless trash is
+ * disabled, item is already in the trash, or $force_delete is true.
*
* The post comment count will be updated if the comment was approved and has a
* post ID available.
* @uses wp_transition_comment_status() Passes new and old comment status along with $comment object
*
* @param int $comment_id Comment ID
+ * @param bool $force_delete Whether to bypass trash and force deletion. Default is false.
* @return bool False if delete comment query failure, true on success.
*/
-function wp_delete_comment($comment_id) {
+function wp_delete_comment($comment_id, $force_delete = false) {
global $wpdb;
if (!$comment = get_comment($comment_id))
return false;
- if (wp_get_comment_status($comment_id) != 'trash' && wp_get_comment_status($comment_id) != 'spam' && EMPTY_TRASH_DAYS > 0)
+ if ( !$force_delete && EMPTY_TRASH_DAYS && !in_array( wp_get_comment_status($comment_id), array( 'trash', 'spam' ) ) )
return wp_trash_comment($comment_id);
do_action('delete_comment', $comment_id);
/**
* Moves a comment to the Trash
*
+ * If trash is disabled, comment is permanently deleted.
+ *
* @since 2.9.0
* @uses do_action() on 'trash_comment' before trashing
* @uses do_action() on 'trashed_comment' after trashing
+ * @uses wp_delete_comment() if trash is disabled
*
* @param int $comment_id Comment ID.
* @return mixed False on failure
*/
function wp_trash_comment($comment_id) {
- if ( EMPTY_TRASH_DAYS == 0 )
- return wp_delete_comment($comment_id);
+ if ( !EMPTY_TRASH_DAYS )
+ return wp_delete_comment($comment_id, true);
if ( !$comment = get_comment($comment_id) )
return false;
$commentdata['user_id'] = apply_filters('pre_user_id', $commentdata['user_ID']);
elseif ( isset($commentdata['user_id']) )
$commentdata['user_id'] = apply_filters('pre_user_id', $commentdata['user_id']);
- $commentdata['comment_agent'] = apply_filters('pre_comment_user_agent', $commentdata['comment_agent']);
+ $commentdata['comment_agent'] = apply_filters('pre_comment_user_agent', ( isset( $commentdata['comment_agent'] ) ? $commentdata['comment_agent'] : '' ) );
$commentdata['comment_author'] = apply_filters('pre_comment_author_name', $commentdata['comment_author']);
$commentdata['comment_content'] = apply_filters('pre_comment_content', $commentdata['comment_content']);
$commentdata['comment_author_IP'] = apply_filters('pre_comment_user_ip', $commentdata['comment_author_IP']);
$post = &get_post($commentdata['comment_post_ID']); // Don't notify if it's your own comment
- if ( get_option('comments_notify') && $commentdata['comment_approved'] && $post->post_author != $commentdata['user_id'] )
- wp_notify_postauthor($comment_ID, $commentdata['comment_type']);
+ if ( get_option('comments_notify') && $commentdata['comment_approved'] && ( ! isset( $commentdata['user_id'] ) || $post->post_author != $commentdata['user_id'] ) )
+ wp_notify_postauthor($comment_ID, empty( $commentdata['comment_type'] ) ? $commentdata['comment_type'] : '' );
}
return $comment_ID;
$comment_approved = 1;
$data = compact('comment_content', 'comment_author', 'comment_author_email', 'comment_approved', 'comment_karma', 'comment_author_url', 'comment_date', 'comment_date_gmt');
- $wpdb->update($wpdb->comments, $data, compact('comment_ID'));
-
- $rval = $wpdb->rows_affected;
+ $rval = $wpdb->update( $wpdb->comments, $data, compact( 'comment_ID' ) );
clean_comment_cache($comment_ID);
wp_update_comment_count($comment_post_ID);
* @param int $deprecated Not Used.
* @return bool|string False on failure, string containing URI on success.
*/
-function discover_pingback_server_uri($url, $deprecated = 2048) {
+function discover_pingback_server_uri( $url, $deprecated = '' ) {
+ if ( !empty( $deprecated ) )
+ _deprecated_argument( __FUNCTION__, '2.7' );
$pingback_str_dquote = 'rel="pingback"';
$pingback_str_squote = 'rel=\'pingback\'';
// when set to true, this outputs debug messages by itself
$client->debug = false;
- $home = trailingslashit( get_option('home') );
+ $home = trailingslashit( home_url() );
if ( !$client->query('weblogUpdates.extendedPing', get_option('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
$client->query('weblogUpdates.ping', get_option('blogname'), $home);
}