2004-12-16 03:57:05 +01:00
< ? php
2008-01-04 21:03:42 +01:00
/**
* Manages WordPress comments
*
* @ package WordPress
2008-08-05 00:29:37 +02:00
* @ subpackage Comment
2008-01-04 21:03:42 +01:00
*/
/**
2014-09-23 20:47:15 +02:00
* Check whether a comment passes internal checks to be allowed to add .
2008-01-04 21:03:42 +01:00
*
2014-09-23 20:47:15 +02:00
* If manual comment moderation is set in the administration , then all checks ,
* regardless of their type and whitelist , will fail and the function will
* return false .
2008-06-15 11:34:00 +02:00
*
2008-09-22 22:21:10 +02:00
* If the number of links exceeds the amount in the administration , then the
* check fails . If any of the parameter contents match the blacklist of words ,
* then the check fails .
*
2014-09-23 20:47:15 +02:00
* If the comment author was approved before , then the comment is automatically
* whitelisted .
2008-06-15 11:34:00 +02:00
*
2014-09-23 20:47:15 +02:00
* If all checks pass , the function will return true .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* @ since 1.2 . 0
2014-09-23 20:47:15 +02:00
*
2014-10-31 18:56:22 +01:00
* @ global wpdb $wpdb WordPress database abstraction object .
2014-09-23 20:47:15 +02:00
*
* @ param string $author Comment author name .
* @ param string $email Comment author email .
* @ param string $url Comment author URL .
* @ param string $comment Content of the comment .
* @ param string $user_ip Comment author IP address .
* @ param string $user_agent Comment author User - Agent .
* @ param string $comment_type Comment type , either user - submitted comment ,
* trackback , or pingback .
* @ return bool If all checks pass , true , otherwise false .
2008-01-04 21:03:42 +01:00
*/
2006-04-19 04:32:12 +02:00
function check_comment ( $author , $email , $url , $comment , $user_ip , $user_agent , $comment_type ) {
global $wpdb ;
2006-02-12 08:53:23 +01:00
2014-09-23 20:49:17 +02:00
// If manual moderation is enabled, skip all checks and return false.
2006-12-07 04:57:23 +01:00
if ( 1 == get_option ( 'comment_moderation' ) )
2014-09-23 20:49:17 +02:00
return false ;
2005-09-20 05:17:43 +02:00
2013-12-01 02:12:11 +01:00
/** This filter is documented in wp-includes/comment-template.php */
2010-11-13 23:30:36 +01:00
$comment = apply_filters ( 'comment_text' , $comment );
2014-09-23 20:49:17 +02:00
// Check for the number of external links if a max allowed number is set.
2010-02-28 21:02:14 +01:00
if ( $max_links = get_option ( 'comment_max_links' ) ) {
2010-11-13 23:30:36 +01:00
$num_links = preg_match_all ( '/<a [^>]*href/i' , $comment , $out );
2014-09-23 20:49:17 +02:00
2013-12-01 02:12:11 +01:00
/**
* Filter the maximum number of links allowed in a comment .
*
* @ since 3.0 . 0
*
* @ param int $num_links The number of links allowed .
* @ param string $url Comment author ' s URL . Included in allowed links total .
*/
$num_links = apply_filters ( 'comment_max_links_url' , $num_links , $url );
2014-09-23 20:49:17 +02:00
/*
* If the number of links in the comment exceeds the allowed amount ,
* fail the check by returning false .
*/
2010-02-28 21:02:14 +01:00
if ( $num_links >= $max_links )
return false ;
}
2005-09-20 05:17:43 +02:00
2006-12-07 04:57:23 +01:00
$mod_keys = trim ( get_option ( 'moderation_keys' ));
2014-09-23 20:49:17 +02:00
// If moderation 'keys' (keywords) are set, process them.
2006-04-19 04:32:12 +02:00
if ( ! empty ( $mod_keys ) ) {
$words = explode ( " \n " , $mod_keys );
2005-09-20 05:17:43 +02:00
2008-08-06 22:31:54 +02:00
foreach ( ( array ) $words as $word ) {
2006-04-19 04:32:12 +02:00
$word = trim ( $word );
2005-09-20 05:17:43 +02:00
2014-09-23 20:49:17 +02:00
// Skip empty lines.
2006-12-07 04:57:23 +01:00
if ( empty ( $word ) )
continue ;
2005-09-20 05:17:43 +02:00
2014-09-23 20:49:17 +02:00
/*
* Do some escaping magic so that '#' ( number of ) characters in the spam
* words don ' t break things :
*/
2006-04-19 04:32:12 +02:00
$word = preg_quote ( $word , '#' );
2005-11-11 00:31:58 +01:00
2014-09-23 20:49:17 +02:00
/*
* Check the comment fields for moderation keywords . If any are found ,
* fail the check for the given field by returning false .
*/
2006-11-19 08:56:05 +01:00
$pattern = " # $word #i " ;
2006-04-19 04:32:12 +02:00
if ( preg_match ( $pattern , $author ) ) return false ;
if ( preg_match ( $pattern , $email ) ) return false ;
if ( preg_match ( $pattern , $url ) ) return false ;
if ( preg_match ( $pattern , $comment ) ) return false ;
if ( preg_match ( $pattern , $user_ip ) ) return false ;
if ( preg_match ( $pattern , $user_agent ) ) return false ;
}
}
2005-11-11 00:31:58 +01:00
2014-09-23 20:49:17 +02:00
/*
* Check if the option to approve comments by previously - approved authors is enabled .
*
* If it is enabled , check whether the comment author has a previously - approved comment ,
* as well as whether there are any moderation keywords ( if set ) present in the author
* email address . If both checks pass , return true . Otherwise , return false .
*/
2006-08-30 23:46:31 +02:00
if ( 1 == get_option ( 'comment_whitelist' )) {
2010-11-30 23:46:35 +01:00
if ( 'trackback' != $comment_type && 'pingback' != $comment_type && $author != '' && $email != '' ) {
2007-09-27 09:34:15 +02:00
// expected_slashed ($author, $email)
2006-04-19 04:32:12 +02:00
$ok_to_comment = $wpdb -> get_var ( " SELECT comment_approved FROM $wpdb->comments WHERE comment_author = ' $author ' AND comment_author_email = ' $email ' and comment_approved = '1' LIMIT 1 " );
if ( ( 1 == $ok_to_comment ) &&
( empty ( $mod_keys ) || false === strpos ( $email , $mod_keys ) ) )
return true ;
else
return false ;
} else {
return false ;
}
2005-09-20 05:17:43 +02:00
}
2006-04-19 04:32:12 +02:00
return true ;
2005-09-20 05:17:43 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Retrieve the approved comments for post $post_id .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* @ since 2.0 . 0
2014-10-30 03:51:23 +01:00
* @ since 4.1 . 0 Refactored to leverage { @ see WP_Comment_Query } over a direct query .
2008-01-04 21:03:42 +01:00
*
2014-10-30 03:51:23 +01:00
* @ param int $post_id The ID of the post .
2014-11-08 21:35:22 +01:00
* @ param array $args Optional . See { @ see WP_Comment_Query :: query ()} for information
2014-10-30 03:51:23 +01:00
* on accepted arguments .
2014-11-08 21:35:22 +01:00
* @ return int | array $comments The approved comments , or number of comments if `$count`
* argument is true .
2008-01-04 21:03:42 +01:00
*/
2014-11-20 02:52:23 +01:00
function get_approved_comments ( $post_id , $args = array () ) {
if ( ! $post_id ) {
return array ();
}
2014-10-29 22:58:23 +01:00
$defaults = array (
'status' => 1 ,
'post_id' => $post_id ,
'order' => 'ASC' ,
);
$r = wp_parse_args ( $args , $defaults );
$query = new WP_Comment_Query ;
return $query -> query ( $r );
2006-04-19 04:32:12 +02:00
}
2005-09-20 05:17:43 +02:00
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Retrieves comment data given a comment ID or comment object .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* If an object is passed then the comment data will be cached and then returned
2008-09-22 05:39:41 +02:00
* after being passed through a filter . If the comment is empty , then the global
* comment variable will be used , if it is set .
2008-06-15 11:34:00 +02:00
*
2008-09-22 05:39:41 +02:00
* @ since 2.0 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* @ param object | string | int $comment Comment to retrieve .
2008-09-22 05:39:41 +02:00
* @ param string $output Optional . OBJECT or ARRAY_A or ARRAY_N constants .
2008-01-04 21:03:42 +01:00
* @ return object | array | null Depends on $output value .
*/
2012-09-10 19:00:11 +02:00
function get_comment ( & $comment , $output = OBJECT ) {
2007-06-08 02:20:22 +02:00
global $wpdb ;
2005-09-20 05:17:43 +02:00
2007-04-27 05:51:36 +02:00
if ( empty ( $comment ) ) {
if ( isset ( $GLOBALS [ 'comment' ]) )
$_comment = & $GLOBALS [ 'comment' ];
else
$_comment = null ;
} elseif ( is_object ( $comment ) ) {
2007-06-08 02:20:22 +02:00
wp_cache_add ( $comment -> comment_ID , $comment , 'comment' );
$_comment = $comment ;
2006-04-19 04:32:12 +02:00
} else {
2007-04-27 06:34:44 +02:00
if ( isset ( $GLOBALS [ 'comment' ]) && ( $GLOBALS [ 'comment' ] -> comment_ID == $comment ) ) {
2007-04-27 05:51:36 +02:00
$_comment = & $GLOBALS [ 'comment' ];
2007-06-08 02:20:22 +02:00
} elseif ( ! $_comment = wp_cache_get ( $comment , 'comment' ) ) {
2007-09-27 09:34:15 +02:00
$_comment = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1 " , $comment ));
2009-11-19 18:58:11 +01:00
if ( ! $_comment )
2014-01-29 07:46:12 +01:00
return null ;
2007-06-08 02:20:22 +02:00
wp_cache_add ( $_comment -> comment_ID , $_comment , 'comment' );
2006-04-19 04:32:12 +02:00
}
}
2005-11-16 07:29:36 +01:00
2013-12-01 02:12:11 +01:00
/**
* Fires after a comment is retrieved .
*
* @ since 2.3 . 0
*
* @ param mixed $_comment Comment data .
*/
$_comment = apply_filters ( 'get_comment' , $_comment );
2007-06-08 02:20:22 +02:00
2006-04-19 04:32:12 +02:00
if ( $output == OBJECT ) {
return $_comment ;
} elseif ( $output == ARRAY_A ) {
2008-11-03 07:44:48 +01:00
$__comment = get_object_vars ( $_comment );
return $__comment ;
2006-04-19 04:32:12 +02:00
} elseif ( $output == ARRAY_N ) {
2008-11-03 07:44:48 +01:00
$__comment = array_values ( get_object_vars ( $_comment ));
return $__comment ;
2006-04-19 04:32:12 +02:00
} else {
return $_comment ;
2005-11-22 04:45:40 +01:00
}
2005-09-20 05:17:43 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Retrieve a list of comments .
2008-01-04 21:03:42 +01:00
*
2009-05-04 11:22:44 +02:00
* The comment list can be for the blog as a whole or for an individual post .
2009-05-25 01:47:49 +02:00
*
2008-09-22 05:39:41 +02:00
* @ since 2.7 . 0
2014-10-31 18:56:22 +01:00
*
2015-03-16 15:24:32 +01:00
* @ param string | array $args Optional . Array or string of arguments . See { @ see WP_Comment_Query :: parse_query ()}
2014-11-08 21:35:22 +01:00
* for information on accepted arguments . Default empty .
* @ return int | array List of comments or number of found comments if `$count` argument is true .
2008-01-04 21:03:42 +01:00
*/
2008-08-05 00:29:37 +02:00
function get_comments ( $args = '' ) {
2010-10-04 23:05:31 +02:00
$query = new WP_Comment_Query ;
return $query -> query ( $args );
}
2008-08-05 00:29:37 +02:00
2010-10-27 20:16:52 +02:00
/**
* WordPress Comment Query class .
*
2015-03-16 21:18:28 +01:00
* See WP_Comment_Query :: __construct () for accepted arguments .
2014-11-08 21:35:22 +01:00
*
2010-10-27 20:16:52 +02:00
* @ since 3.1 . 0
*/
2010-11-13 19:32:43 +01:00
class WP_Comment_Query {
2014-10-24 04:34:18 +02:00
/**
* SQL for database query .
*
* @ since 4.0 . 1
* @ access public
* @ var string
*/
public $request ;
2012-09-27 23:53:14 +02:00
/**
* Metadata query container
*
2012-09-28 14:31:39 +02:00
* @ since 3.5 . 0
2012-09-27 23:53:14 +02:00
* @ access public
* @ var object WP_Meta_Query
*/
2014-05-19 08:19:14 +02:00
public $meta_query = false ;
2010-10-04 23:05:31 +02:00
2013-08-27 18:39:09 +02:00
/**
* Date query container
*
* @ since 3.7 . 0
* @ access public
* @ var object WP_Date_Query
*/
2014-05-19 08:19:14 +02:00
public $date_query = false ;
2014-11-03 04:08:22 +01:00
/**
2015-03-16 15:24:32 +01:00
* Query vars set by the user .
*
* @ since 3.1 . 0
* @ access public
2014-11-03 04:08:22 +01:00
* @ var array
*/
public $query_vars ;
/**
2015-03-16 15:24:32 +01:00
* Default values for query vars .
*
* @ since 4.2 . 0
* @ access public
* @ var array
*/
public $query_var_defaults ;
/**
* List of comments located by the query .
*
* @ since 4.0 . 0
* @ access public
2014-11-03 04:08:22 +01:00
* @ var array
*/
public $comments ;
2014-05-19 08:19:14 +02:00
/**
2014-07-14 03:12:14 +02:00
* Make private / protected methods readable for backwards compatibility .
2014-05-19 08:19:14 +02:00
*
* @ since 4.0 . 0
2014-07-14 02:48:14 +02:00
* @ access public
*
* @ param callable $name Method to call .
* @ param array $arguments Arguments to pass when calling .
* @ return mixed | bool Return value of the callback , false otherwise .
2014-05-19 08:19:14 +02:00
*/
public function __call ( $name , $arguments ) {
2015-01-11 23:33:24 +01:00
if ( 'get_search_sql' === $name ) {
return call_user_func_array ( array ( $this , $name ), $arguments );
}
return false ;
2014-05-19 08:19:14 +02:00
}
2013-08-27 18:39:09 +02:00
2010-10-27 20:16:52 +02:00
/**
2015-03-16 15:24:32 +01:00
* Constructor .
2010-10-27 20:16:52 +02:00
*
2015-03-16 15:24:32 +01:00
* Sets up the comment query , based on the query vars passed .
*
* @ since 4.2 . 0
* @ access public
*
* @ param string | array $query {
2015-03-16 21:18:28 +01:00
* Optional . Array or query string of comment query parameters . Default empty .
2014-11-08 21:19:23 +01:00
*
* @ type string $author_email Comment author email address . Default empty .
* @ type array $author__in Array of author IDs to include comments for . Default empty .
* @ type array $author__not_in Array of author IDs to exclude comments for . Default empty .
* @ type array $comment__in Array of comment IDs to include . Default empty .
* @ type array $comment__not_in Array of comment IDs to exclude . Default empty .
* @ type bool $count Whether to return a comment count ( true ) or array of comment
* objects ( false ) . Default false .
2015-03-16 21:18:28 +01:00
* @ type array $date_query Date query clauses to limit comments by . See WP_Date_Query .
2014-11-08 21:19:23 +01:00
* Default null .
* @ type string $fields Comment fields to return . Accepts 'ids' for comment IDs only or
* empty for all fields . Default empty .
* @ type int $ID Currently unused .
* @ type array $include_unapproved Array of IDs or email addresses of users whose unapproved comments
* will be returned by the query regardless of `$status` . Default empty .
* @ type int $karma Karma score to retrieve matching comments for . Default empty .
* @ type string $meta_key Include comments with a matching comment meta key . Default empty .
* @ type string $meta_value Include comments with a matching comment meta value . Requires
* `$meta_key` to be set . Default empty .
* @ type array $meta_query Meta query clauses to limit retrieved comments by .
2015-03-16 21:18:28 +01:00
* See WP_Meta_Query . Default empty .
2014-11-08 21:19:23 +01:00
* @ type int $number Maximum number of comments to retrieve . Default null ( no limit ) .
* @ type int $offset Number of comments to offset the query . Used to build LIMIT clause .
* Default 0.
2015-02-16 15:10:27 +01:00
* @ type string | array $orderby Comment status or array of statuses . To use 'meta_value' or
* 'meta_value_num' , `$meta_key` must also be defined . To sort by
* a specific `$meta_query` clause , use that clause ' s array key .
* Accepts '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' ,
2014-11-08 21:19:23 +01:00
* 'comment_parent' , 'comment_post_ID' , 'comment_type' , 'user_id' ,
2015-02-16 15:10:27 +01:00
* 'meta_value' , 'meta_value_num' , the value of $meta_key , and the
* array keys of `$meta_query` . Also accepts false , an empty array ,
* or 'none' to disable `ORDER BY` clause .
* Default : 'comment_date_gmt' .
2014-11-08 21:19:23 +01:00
* @ type string $order How to order retrieved comments . Accepts 'ASC' , 'DESC' .
* Default : 'DESC' .
* @ type int $parent Parent ID of comment to retrieve children of . Default empty .
* @ type array $post_author__in Array of author IDs to retrieve comments for . Default empty .
* @ type array $post_author__not_in Array of author IDs * not * to retrieve comments for . Default empty .
* @ type int $post_ID Currently unused .
* @ type int $post_id Limit results to those affiliated with a given post ID . Default 0.
* @ type array $post__in Array of post IDs to include affiliated comments for . Default empty .
* @ type array $post__not_in Array of post IDs to exclude affiliated comments for . Default empty .
* @ type int $post_author Comment author ID to limit results by . Default empty .
* @ type string $post_status Post status to retrieve affiliated comments for . Default empty .
* @ type string $post_type Post type to retrieve affiliated comments for . Default empty .
* @ type string $post_name Post name to retrieve affiliated comments for . Default empty .
* @ type int $post_parent Post parent ID to retrieve affiliated comments for . Default empty .
* @ type string $search Search term ( s ) to retrieve matching comments for . Default empty .
* @ type string $status Comment status to limit results by . Accepts 'hold'
* ( `comment_status=0` ), 'approve' ( `comment_status=1` ), 'all' , or a
* custom comment status . Default 'all' .
* @ type string | array $type Include comments of a given type , or array of types . Accepts
* 'comment' , 'pings' ( includes 'pingback' and 'trackback' ), or any
* custom type string . Default empty .
* @ type array $type__in Include comments from a given array of comment types . Default empty .
* @ type array $type__not_in Exclude comments from a given array of comment types . Default empty .
* @ type int $user_id Include comments for a specific user ID . Default empty .
* }
2015-03-16 21:18:28 +01:00
* @ return WP_Comment_Query WP_Comment_Query instance .
*/
public function __construct ( $query = '' ) {
$this -> query_var_defaults = array (
'author_email' => '' ,
'author__in' => '' ,
'author__not_in' => '' ,
'include_unapproved' => '' ,
'fields' => '' ,
'ID' => '' ,
'comment__in' => '' ,
'comment__not_in' => '' ,
'karma' => '' ,
'number' => '' ,
'offset' => '' ,
'orderby' => '' ,
'order' => 'DESC' ,
'parent' => '' ,
'post_author__in' => '' ,
'post_author__not_in' => '' ,
'post_ID' => '' ,
'post_id' => 0 ,
'post__in' => '' ,
'post__not_in' => '' ,
'post_author' => '' ,
'post_name' => '' ,
'post_parent' => '' ,
'post_status' => '' ,
'post_type' => '' ,
'status' => 'all' ,
'type' => '' ,
'type__in' => '' ,
'type__not_in' => '' ,
'user_id' => '' ,
'search' => '' ,
'count' => false ,
'meta_key' => '' ,
'meta_value' => '' ,
'meta_query' => '' ,
'date_query' => null , // See WP_Date_Query
);
if ( ! empty ( $query ) ) {
$this -> query ( $query );
}
}
/**
* Parse arguments passed to the comment query with default query parameters .
*
* @ since 4.2 . 0 Extracted from WP_Comment_Query :: query () .
*
* @ access public
*
* @ param string | array $query WP_Comment_Query arguments . See WP_Comment_Query :: __construct ()
2010-10-27 20:16:52 +02:00
*/
2015-03-16 15:24:32 +01:00
public function parse_query ( $query = '' ) {
if ( empty ( $query ) ) {
$query = $this -> query_vars ;
}
2010-10-04 23:05:31 +02:00
2015-03-16 15:24:32 +01:00
$this -> query_vars = wp_parse_args ( $query , $this -> query_var_defaults );
do_action_ref_array ( 'parse_comment_query' , array ( & $this ) );
}
/**
* Sets up the WordPress query for retrieving comments .
*
* @ since 3.1 . 0
* @ since 4.1 . 0 Introduced 'comment__in' , 'comment__not_in' , 'post_author__in' ,
* 'post_author__not_in' , 'author__in' , 'author__not_in' , 'post__in' ,
* 'post__not_in' , 'include_unapproved' , 'type__in' , and 'type__not_in'
* arguments to $query_vars .
2015-04-05 17:47:27 +02:00
* @ since 4.2 . 0 Moved parsing to WP_Comment_Query :: parse_query () .
2015-03-16 15:24:32 +01:00
* @ access public
*
* @ param string | array $query Array or URL query string of parameters .
* @ return array List of comments .
*/
public function query ( $query ) {
$this -> query_vars = wp_parse_args ( $query );
return $this -> get_comments ();
}
/**
* Get a list of comments matching the query vars .
*
* @ since 4.2 . 0
* @ access public
*
2015-04-05 17:47:27 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
*
2015-03-16 15:24:32 +01:00
* @ return array The list of comments .
*/
public function get_comments () {
global $wpdb ;
2008-11-04 17:44:55 +01:00
2012-09-27 23:53:14 +02:00
$groupby = '' ;
2015-03-16 15:24:32 +01:00
$this -> parse_query ();
2012-09-27 23:53:14 +02:00
// Parse meta query
$this -> meta_query = new WP_Meta_Query ();
$this -> meta_query -> parse_query_vars ( $this -> query_vars );
2015-02-16 15:10:27 +01:00
if ( ! empty ( $this -> meta_query -> queries ) ) {
$meta_query_clauses = $this -> meta_query -> get_sql ( 'comment' , $wpdb -> comments , 'comment_ID' , $this );
}
2013-12-01 02:12:11 +01:00
/**
* Fires before comments are retrieved .
*
* @ since 3.1 . 0
*
* @ param WP_Comment_Query & $this Current instance of WP_Comment_Query , passed by reference .
*/
2010-10-27 20:49:45 +02:00
do_action_ref_array ( 'pre_get_comments' , array ( & $this ) );
2008-11-04 17:44:55 +01:00
2015-03-16 15:24:32 +01:00
// $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
$key = md5 ( serialize ( wp_array_slice_assoc ( $this -> query_vars , array_keys ( $this -> query_var_defaults ) ) ) );
2012-09-28 14:47:31 +02:00
$last_changed = wp_cache_get ( 'last_changed' , 'comment' );
2013-01-22 16:46:16 +01:00
if ( ! $last_changed ) {
2014-02-26 23:05:13 +01:00
$last_changed = microtime ();
2013-01-24 18:21:55 +01:00
wp_cache_set ( 'last_changed' , $last_changed , 'comment' );
2013-01-22 16:46:16 +01:00
}
2010-10-04 23:05:31 +02:00
$cache_key = " get_comments: $key : $last_changed " ;
2008-08-05 00:29:37 +02:00
2014-05-16 21:33:14 +02:00
if ( $cache = wp_cache_get ( $cache_key , 'comment' ) ) {
2015-03-16 15:24:32 +01:00
$this -> comments = $cache ;
return $this -> comments ;
2014-05-16 21:33:14 +02:00
}
2008-08-05 00:29:37 +02:00
2014-10-29 03:22:23 +01:00
$where = array ();
Use the comment API rather than direct SQL queries in `comments_template()`.
`comments_template()` is used by most themes to display a post's comments. It
shows all comments that have been approved, and also shows all pending comments
by the current visitor (as determined by the comment cookies). However, the
comments API previously had no way of querying for "all comments that are
either approved, or are unapproved but written by foo@example.com". The
workaround was a direct SQL query: uncached, not subject to the same filters as
other comment queries, and just generally icky.
The new `include_unapproved` parameter for `WP_Comment_Query` accepts an array
of user IDs or email addresses. Pending comments associated with users in this
array will be included in query results, regardless of the value of the 'status'
parameter. In `comments_template()`, we leap from direct SQL queries to
`get_comments()` plus `include_unapproved', striving to put right what once
went wrong.
Props boonebgorges, simonwheatley, hardy101, jesin.
Fixes #19623.
Built from https://develop.svn.wordpress.org/trunk@29965
git-svn-id: http://core.svn.wordpress.org/trunk@29712 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-19 21:39:20 +02:00
// Assemble clauses related to 'comment_approved'.
$approved_clauses = array ();
2014-10-29 03:22:23 +01:00
// 'status' accepts an array or a comma-separated string.
$status_clauses = array ();
$statuses = $this -> query_vars [ 'status' ];
if ( ! is_array ( $statuses ) ) {
$statuses = preg_split ( '/[\s,]+/' , $statuses );
}
// 'any' overrides other statuses.
if ( ! in_array ( 'any' , $statuses ) ) {
foreach ( $statuses as $status ) {
switch ( $status ) {
case 'hold' :
$status_clauses [] = " comment_approved = '0' " ;
break ;
case 'approve' :
$status_clauses [] = " comment_approved = '1' " ;
break ;
case 'all' :
2014-10-29 20:51:23 +01:00
case '' :
2014-10-29 03:22:23 +01:00
$status_clauses [] = " ( comment_approved = '0' OR comment_approved = '1' ) " ;
break ;
default :
$status_clauses [] = $wpdb -> prepare ( " comment_approved = %s " , $status );
break ;
}
}
if ( ! empty ( $status_clauses ) ) {
$approved_clauses [] = '( ' . implode ( ' OR ' , $status_clauses ) . ' )' ;
}
2014-05-16 21:33:14 +02:00
}
Use the comment API rather than direct SQL queries in `comments_template()`.
`comments_template()` is used by most themes to display a post's comments. It
shows all comments that have been approved, and also shows all pending comments
by the current visitor (as determined by the comment cookies). However, the
comments API previously had no way of querying for "all comments that are
either approved, or are unapproved but written by foo@example.com". The
workaround was a direct SQL query: uncached, not subject to the same filters as
other comment queries, and just generally icky.
The new `include_unapproved` parameter for `WP_Comment_Query` accepts an array
of user IDs or email addresses. Pending comments associated with users in this
array will be included in query results, regardless of the value of the 'status'
parameter. In `comments_template()`, we leap from direct SQL queries to
`get_comments()` plus `include_unapproved', striving to put right what once
went wrong.
Props boonebgorges, simonwheatley, hardy101, jesin.
Fixes #19623.
Built from https://develop.svn.wordpress.org/trunk@29965
git-svn-id: http://core.svn.wordpress.org/trunk@29712 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-19 21:39:20 +02:00
// User IDs or emails whose unapproved comments are included, regardless of $status.
if ( ! empty ( $this -> query_vars [ 'include_unapproved' ] ) ) {
$include_unapproved = $this -> query_vars [ 'include_unapproved' ];
// Accepts arrays or comma-separated strings.
if ( ! is_array ( $include_unapproved ) ) {
$include_unapproved = preg_split ( '/[\s,]+/' , $include_unapproved );
}
$unapproved_ids = $unapproved_emails = array ();
foreach ( $include_unapproved as $unapproved_identifier ) {
// Numeric values are assumed to be user ids.
if ( is_numeric ( $unapproved_identifier ) ) {
$approved_clauses [] = $wpdb -> prepare ( " ( user_id = %d AND comment_approved = '0' ) " , $unapproved_identifier );
// Otherwise we match against email addresses.
} else {
$approved_clauses [] = $wpdb -> prepare ( " ( comment_author_email = %s AND comment_approved = '0' ) " , $unapproved_identifier );
}
}
}
// Collapse comment_approved clauses into a single OR-separated clause.
2014-10-29 03:22:23 +01:00
if ( ! empty ( $approved_clauses ) ) {
if ( 1 === count ( $approved_clauses ) ) {
$where [] = $approved_clauses [ 0 ];
} else {
$where [] = '( ' . implode ( ' OR ' , $approved_clauses ) . ' )' ;
}
Use the comment API rather than direct SQL queries in `comments_template()`.
`comments_template()` is used by most themes to display a post's comments. It
shows all comments that have been approved, and also shows all pending comments
by the current visitor (as determined by the comment cookies). However, the
comments API previously had no way of querying for "all comments that are
either approved, or are unapproved but written by foo@example.com". The
workaround was a direct SQL query: uncached, not subject to the same filters as
other comment queries, and just generally icky.
The new `include_unapproved` parameter for `WP_Comment_Query` accepts an array
of user IDs or email addresses. Pending comments associated with users in this
array will be included in query results, regardless of the value of the 'status'
parameter. In `comments_template()`, we leap from direct SQL queries to
`get_comments()` plus `include_unapproved', striving to put right what once
went wrong.
Props boonebgorges, simonwheatley, hardy101, jesin.
Fixes #19623.
Built from https://develop.svn.wordpress.org/trunk@29965
git-svn-id: http://core.svn.wordpress.org/trunk@29712 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2014-10-19 21:39:20 +02:00
}
2014-05-16 21:33:14 +02:00
$order = ( 'ASC' == strtoupper ( $this -> query_vars [ 'order' ] ) ) ? 'ASC' : 'DESC' ;
2010-10-04 23:05:31 +02:00
2014-10-24 04:51:19 +02:00
// Disable ORDER BY with 'none', an empty array, or boolean false.
if ( in_array ( $this -> query_vars [ 'orderby' ], array ( 'none' , array (), false ), true ) ) {
$orderby = '' ;
2015-01-08 08:05:25 +01:00
} elseif ( ! empty ( $this -> query_vars [ 'orderby' ] ) ) {
2014-05-16 21:33:14 +02:00
$ordersby = is_array ( $this -> query_vars [ 'orderby' ] ) ?
$this -> query_vars [ 'orderby' ] :
preg_split ( '/[,\s]/' , $this -> query_vars [ 'orderby' ] );
2010-10-04 23:05:31 +02:00
2015-02-16 15:10:27 +01:00
$orderby_array = array ();
$found_orderby_comment_ID = false ;
foreach ( $ordersby as $_key => $_value ) {
if ( ! $_value ) {
continue ;
}
if ( is_int ( $_key ) ) {
$_orderby = $_value ;
$_order = $order ;
} else {
$_orderby = $_key ;
$_order = $_value ;
}
if ( ! $found_orderby_comment_ID && 'comment_ID' === $_orderby ) {
$found_orderby_comment_ID = true ;
}
$parsed = $this -> parse_orderby ( $_orderby );
if ( ! $parsed ) {
continue ;
}
$orderby_array [] = $parsed . ' ' . $this -> parse_order ( $_order );
}
// If no valid clauses were found, order by comment_date_gmt.
if ( empty ( $orderby_array ) ) {
$orderby_array [] = " $wpdb->comments .comment_date_gmt $order " ;
2012-09-27 23:53:14 +02:00
}
2015-02-16 15:10:27 +01:00
// To ensure determinate sorting, always include a comment_ID clause.
if ( ! $found_orderby_comment_ID ) {
$comment_ID_order = '' ;
// Inherit order from comment_date or comment_date_gmt, if available.
foreach ( $orderby_array as $orderby_clause ) {
if ( preg_match ( '/comment_date(?:_gmt)*\ (ASC|DESC)/' , $orderby_clause , $match ) ) {
$comment_ID_order = $match [ 1 ];
break ;
}
}
// If no date-related order is available, use the date from the first available clause.
if ( ! $comment_ID_order ) {
foreach ( $orderby_array as $orderby_clause ) {
if ( false !== strpos ( 'ASC' , $orderby_clause ) ) {
$comment_ID_order = 'ASC' ;
} else {
$comment_ID_order = 'DESC' ;
}
break ;
}
2012-09-27 23:53:14 +02:00
}
2015-02-16 15:10:27 +01:00
// Default to DESC.
if ( ! $comment_ID_order ) {
$comment_ID_order = 'DESC' ;
}
$orderby_array [] = " $wpdb->comments .comment_ID $comment_ID_order " ;
2012-09-27 23:53:14 +02:00
}
2015-02-16 15:10:27 +01:00
$orderby = implode ( ', ' , $orderby_array );
2010-10-04 23:05:31 +02:00
} else {
2015-02-16 15:10:27 +01:00
$orderby = " $wpdb->comments .comment_date_gmt $order " ;
2010-10-04 23:05:31 +02:00
}
2014-05-16 21:33:14 +02:00
$number = absint ( $this -> query_vars [ 'number' ] );
$offset = absint ( $this -> query_vars [ 'offset' ] );
2008-08-05 00:29:37 +02:00
2014-05-16 21:33:14 +02:00
if ( ! empty ( $number ) ) {
if ( $offset ) {
2010-10-27 21:05:39 +02:00
$limits = 'LIMIT ' . $offset . ',' . $number ;
2014-05-16 21:33:14 +02:00
} else {
2010-10-27 21:05:39 +02:00
$limits = 'LIMIT ' . $number ;
2014-05-16 21:33:14 +02:00
}
2010-10-04 23:05:31 +02:00
} else {
2010-10-27 21:05:39 +02:00
$limits = '' ;
2010-10-04 23:05:31 +02:00
}
2014-05-16 21:33:14 +02:00
if ( $this -> query_vars [ 'count' ] ) {
2010-10-27 21:05:39 +02:00
$fields = 'COUNT(*)' ;
2014-05-16 21:33:14 +02:00
} else {
2014-07-09 20:16:15 +02:00
switch ( strtolower ( $this -> query_vars [ 'fields' ] ) ) {
case 'ids' :
$fields = " $wpdb->comments .comment_ID " ;
break ;
default :
$fields = " * " ;
break ;
}
2014-05-16 21:33:14 +02:00
}
2014-07-09 20:16:15 +02:00
2010-10-27 21:05:39 +02:00
$join = '' ;
2010-10-04 23:05:31 +02:00
2014-05-16 21:33:14 +02:00
$post_id = absint ( $this -> query_vars [ 'post_id' ] );
if ( ! empty ( $post_id ) ) {
2014-10-29 03:22:23 +01:00
$where [] = $wpdb -> prepare ( 'comment_post_ID = %d' , $post_id );
2014-05-16 21:33:14 +02:00
}
2014-10-02 03:41:16 +02:00
// Parse comment IDs for an IN clause.
if ( ! empty ( $this -> query_vars [ 'comment__in' ] ) ) {
2014-10-29 03:22:23 +01:00
$where [] = 'comment_ID IN ( ' . implode ( ',' , wp_parse_id_list ( $this -> query_vars [ 'comment__in' ] ) ) . ' )' ;
2014-10-02 03:41:16 +02:00
}
// Parse comment IDs for a NOT IN clause.
if ( ! empty ( $this -> query_vars [ 'comment__not_in' ] ) ) {
2014-10-29 03:22:23 +01:00
$where [] = 'comment_ID NOT IN ( ' . implode ( ',' , wp_parse_id_list ( $this -> query_vars [ 'comment__not_in' ] ) ) . ' )' ;
2014-10-02 03:41:16 +02:00
}
// Parse comment post IDs for an IN clause.
if ( ! empty ( $this -> query_vars [ 'post__in' ] ) ) {
2014-10-29 03:22:23 +01:00
$where [] = 'comment_post_ID IN ( ' . implode ( ',' , wp_parse_id_list ( $this -> query_vars [ 'post__in' ] ) ) . ' )' ;
2014-10-02 03:41:16 +02:00
}
// Parse comment post IDs for a NOT IN clause.
if ( ! empty ( $this -> query_vars [ 'post__not_in' ] ) ) {
2014-10-29 03:22:23 +01:00
$where [] = 'comment_post_ID NOT IN ( ' . implode ( ',' , wp_parse_id_list ( $this -> query_vars [ 'post__not_in' ] ) ) . ' )' ;
2014-10-02 03:41:16 +02:00
}
2014-05-16 21:33:14 +02:00
if ( '' !== $this -> query_vars [ 'author_email' ] ) {
2014-10-29 03:22:23 +01:00
$where [] = $wpdb -> prepare ( 'comment_author_email = %s' , $this -> query_vars [ 'author_email' ] );
2014-05-16 21:33:14 +02:00
}
if ( '' !== $this -> query_vars [ 'karma' ] ) {
2014-10-29 03:22:23 +01:00
$where [] = $wpdb -> prepare ( 'comment_karma = %d' , $this -> query_vars [ 'karma' ] );
2014-05-16 21:33:14 +02:00
}
2014-10-29 22:50:22 +01:00
// Filtering by comment_type: 'type', 'type__in', 'type__not_in'.
$raw_types = array (
'IN' => array_merge ( ( array ) $this -> query_vars [ 'type' ], ( array ) $this -> query_vars [ 'type__in' ] ),
'NOT IN' => ( array ) $this -> query_vars [ 'type__not_in' ],
);
$comment_types = array ();
foreach ( $raw_types as $operator => $_raw_types ) {
$_raw_types = array_unique ( $_raw_types );
foreach ( $_raw_types as $type ) {
switch ( $type ) {
// An empty translates to 'all', for backward compatibility
case '' :
case 'all' :
break ;
case 'comment' :
case 'comments' :
$comment_types [ $operator ][] = " '' " ;
break ;
case 'pings' :
$comment_types [ $operator ][] = " 'pingback' " ;
$comment_types [ $operator ][] = " 'trackback' " ;
break ;
default :
$comment_types [ $operator ][] = $wpdb -> prepare ( '%s' , $type );
break ;
}
}
if ( ! empty ( $comment_types [ $operator ] ) ) {
$types_sql = implode ( ', ' , $comment_types [ $operator ] );
$where [] = " comment_type $operator ( $types_sql ) " ;
}
2010-12-19 05:55:46 +01:00
}
2014-02-25 17:35:13 +01:00
2014-05-16 21:33:14 +02:00
if ( '' !== $this -> query_vars [ 'parent' ] ) {
2014-10-29 03:22:23 +01:00
$where [] = $wpdb -> prepare ( 'comment_parent = %d' , $this -> query_vars [ 'parent' ] );
2014-02-25 17:35:13 +01:00
}
2014-05-16 21:33:14 +02:00
if ( is_array ( $this -> query_vars [ 'user_id' ] ) ) {
2014-10-29 03:22:23 +01:00
$where [] = 'user_id IN (' . implode ( ',' , array_map ( 'absint' , $this -> query_vars [ 'user_id' ] ) ) . ')' ;
2014-05-16 21:33:14 +02:00
} elseif ( '' !== $this -> query_vars [ 'user_id' ] ) {
2014-10-29 03:22:23 +01:00
$where [] = $wpdb -> prepare ( 'user_id = %d' , $this -> query_vars [ 'user_id' ] );
2014-05-16 21:33:14 +02:00
}
if ( '' !== $this -> query_vars [ 'search' ] ) {
2014-10-29 03:22:23 +01:00
$search_sql = $this -> get_search_sql (
2014-05-16 21:33:14 +02:00
$this -> query_vars [ 'search' ],
array ( 'comment_author' , 'comment_author_email' , 'comment_author_url' , 'comment_author_IP' , 'comment_content' )
);
2014-10-29 03:22:23 +01:00
// Strip leading 'AND'.
$where [] = preg_replace ( '/^\s*AND\s*/' , '' , $search_sql );
2014-05-16 21:33:14 +02:00
}
2014-10-17 03:58:18 +02:00
// If any post-related query vars are passed, join the posts table.
$join_posts_table = false ;
2014-05-16 21:33:14 +02:00
$plucked = wp_array_slice_assoc ( $this -> query_vars , array ( 'post_author' , 'post_name' , 'post_parent' , 'post_status' , 'post_type' ) );
$post_fields = array_filter ( $plucked );
2010-10-27 20:49:45 +02:00
2011-04-20 20:02:41 +02:00
if ( ! empty ( $post_fields ) ) {
2014-10-17 03:58:18 +02:00
$join_posts_table = true ;
foreach ( $post_fields as $field_name => $field_value ) {
2014-12-31 20:38:22 +01:00
// $field_value may be an array.
$esses = array_fill ( 0 , count ( ( array ) $field_value ), '%s' );
$where [] = $wpdb -> prepare ( " { $wpdb -> posts } . { $field_name } IN ( " . implode ( ',' , $esses ) . ')' , $field_value );
2014-10-17 03:58:18 +02:00
}
}
// Comment author IDs for an IN clause.
if ( ! empty ( $this -> query_vars [ 'author__in' ] ) ) {
2014-10-29 03:22:23 +01:00
$where [] = 'user_id IN ( ' . implode ( ',' , wp_parse_id_list ( $this -> query_vars [ 'author__in' ] ) ) . ' )' ;
2014-10-17 03:58:18 +02:00
}
// Comment author IDs for a NOT IN clause.
if ( ! empty ( $this -> query_vars [ 'author__not_in' ] ) ) {
2014-10-29 03:22:23 +01:00
$where [] = 'user_id NOT IN ( ' . implode ( ',' , wp_parse_id_list ( $this -> query_vars [ 'author__not_in' ] ) ) . ' )' ;
2014-10-17 03:58:18 +02:00
}
// Post author IDs for an IN clause.
if ( ! empty ( $this -> query_vars [ 'post_author__in' ] ) ) {
$join_posts_table = true ;
2014-10-29 03:22:23 +01:00
$where [] = 'post_author IN ( ' . implode ( ',' , wp_parse_id_list ( $this -> query_vars [ 'post_author__in' ] ) ) . ' )' ;
2014-10-17 03:58:18 +02:00
}
// Post author IDs for a NOT IN clause.
if ( ! empty ( $this -> query_vars [ 'post_author__not_in' ] ) ) {
$join_posts_table = true ;
2014-10-29 03:22:23 +01:00
$where [] = 'post_author NOT IN ( ' . implode ( ',' , wp_parse_id_list ( $this -> query_vars [ 'post_author__not_in' ] ) ) . ' )' ;
2014-10-17 03:58:18 +02:00
}
if ( $join_posts_table ) {
$join = " JOIN $wpdb->posts ON $wpdb->posts .ID = $wpdb->comments .comment_post_ID " ;
2011-04-20 20:02:41 +02:00
}
2015-02-16 15:10:27 +01:00
if ( ! empty ( $meta_query_clauses ) ) {
$join .= $meta_query_clauses [ 'join' ];
2014-10-29 03:22:23 +01:00
// Strip leading 'AND'.
2015-02-16 15:10:27 +01:00
$where [] = preg_replace ( '/^\s*AND\s*/' , '' , $meta_query_clauses [ 'where' ] );
2014-10-26 17:46:19 +01:00
if ( ! $this -> query_vars [ 'count' ] ) {
$groupby = " { $wpdb -> comments } .comment_ID " ;
}
2012-09-27 23:53:14 +02:00
}
2014-05-16 21:33:14 +02:00
$date_query = $this -> query_vars [ 'date_query' ];
2013-08-27 18:39:09 +02:00
if ( ! empty ( $date_query ) && is_array ( $date_query ) ) {
$date_query_object = new WP_Date_Query ( $date_query , 'comment_date' );
2014-10-29 03:22:23 +01:00
$where [] = preg_replace ( '/^\s*AND\s*/' , '' , $date_query_object -> get_sql () );
2013-08-27 18:39:09 +02:00
}
2014-10-29 03:22:23 +01:00
$where = implode ( ' AND ' , $where );
2015-02-16 15:10:27 +01:00
$pieces = array ( 'fields' , 'join' , 'where' , 'orderby' , 'limits' , 'groupby' );
2013-12-01 02:12:11 +01:00
/**
* Filter the comment query clauses .
*
* @ since 3.1 . 0
*
* @ param array $pieces A compacted array of comment query clauses .
* @ param WP_Comment_Query & $this Current instance of WP_Comment_Query , passed by reference .
*/
2010-10-27 20:49:45 +02:00
$clauses = apply_filters_ref_array ( 'comments_clauses' , array ( compact ( $pieces ), & $this ) );
2014-06-11 19:58:14 +02:00
$fields = isset ( $clauses [ 'fields' ] ) ? $clauses [ 'fields' ] : '' ;
$join = isset ( $clauses [ 'join' ] ) ? $clauses [ 'join' ] : '' ;
$where = isset ( $clauses [ 'where' ] ) ? $clauses [ 'where' ] : '' ;
$orderby = isset ( $clauses [ 'orderby' ] ) ? $clauses [ 'orderby' ] : '' ;
$limits = isset ( $clauses [ 'limits' ] ) ? $clauses [ 'limits' ] : '' ;
$groupby = isset ( $clauses [ 'groupby' ] ) ? $clauses [ 'groupby' ] : '' ;
2010-10-04 23:05:31 +02:00
2014-10-29 03:22:23 +01:00
if ( $where ) {
$where = 'WHERE ' . $where ;
}
2014-05-16 21:33:14 +02:00
if ( $groupby ) {
2012-09-27 23:53:14 +02:00
$groupby = 'GROUP BY ' . $groupby ;
2014-05-16 21:33:14 +02:00
}
2014-10-24 04:34:18 +02:00
2014-10-24 04:51:19 +02:00
if ( $orderby ) {
2015-02-16 15:10:27 +01:00
$orderby = " ORDER BY $orderby " ;
2014-10-24 04:51:19 +02:00
}
2014-10-29 03:22:23 +01:00
$this -> request = " SELECT $fields FROM $wpdb->comments $join $where $groupby $orderby $limits " ;
2010-10-27 21:05:39 +02:00
2014-05-16 21:33:14 +02:00
if ( $this -> query_vars [ 'count' ] ) {
2014-10-24 04:34:18 +02:00
return $wpdb -> get_var ( $this -> request );
2014-05-16 21:33:14 +02:00
}
2014-07-09 20:16:15 +02:00
if ( 'ids' == $this -> query_vars [ 'fields' ] ) {
2014-10-24 04:34:18 +02:00
$this -> comments = $wpdb -> get_col ( $this -> request );
2014-07-09 20:16:15 +02:00
return array_map ( 'intval' , $this -> comments );
}
2014-10-24 04:34:18 +02:00
$results = $wpdb -> get_results ( $this -> request );
2013-12-01 02:12:11 +01:00
/**
* Filter the comment query results .
*
* @ since 3.1 . 0
*
2014-05-16 21:33:14 +02:00
* @ param array $results An array of comments .
2013-12-01 02:12:11 +01:00
* @ param WP_Comment_Query & $this Current instance of WP_Comment_Query , passed by reference .
*/
2014-05-16 21:33:14 +02:00
$comments = apply_filters_ref_array ( 'the_comments' , array ( $results , & $this ) );
2010-10-04 23:05:31 +02:00
wp_cache_add ( $cache_key , $comments , 'comment' );
2015-03-16 15:24:32 +01:00
$this -> comments = $comments ;
return $this -> comments ;
2010-10-04 23:05:31 +02:00
}
2010-11-13 19:18:45 +01:00
2013-11-11 14:32:10 +01:00
/**
2010-11-13 19:18:45 +01:00
* Used internally to generate an SQL string for searching across multiple columns
*
* @ access protected
* @ since 3.1 . 0
*
* @ param string $string
* @ param array $cols
* @ return string
*/
2014-05-19 08:19:14 +02:00
protected function get_search_sql ( $string , $cols ) {
2014-06-10 02:44:15 +02:00
global $wpdb ;
2010-11-13 19:18:45 +01:00
2014-06-10 04:20:16 +02:00
$like = '%' . $wpdb -> esc_like ( $string ) . '%' ;
2010-11-13 19:18:45 +01:00
$searches = array ();
2014-06-10 04:20:16 +02:00
foreach ( $cols as $col ) {
$searches [] = $wpdb -> prepare ( " $col LIKE %s " , $like );
}
2010-11-13 19:18:45 +01:00
return ' AND (' . implode ( ' OR ' , $searches ) . ')' ;
}
2015-02-16 15:10:27 +01:00
/**
* Parse and sanitize 'orderby' keys passed to the comment query .
*
* @ since 4.2 . 0
* @ access protected
*
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param string $orderby Alias for the field to order by .
* @ return string | bool Value to used in the ORDER clause . False otherwise .
*/
protected function parse_orderby ( $orderby ) {
global $wpdb ;
$allowed_keys = 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' ,
);
if ( ! empty ( $this -> query_vars [ 'meta_key' ] ) ) {
$allowed_keys [] = $this -> query_vars [ 'meta_key' ];
$allowed_keys [] = 'meta_value' ;
$allowed_keys [] = 'meta_value_num' ;
}
$meta_query_clauses = $this -> meta_query -> get_clauses ();
if ( $meta_query_clauses ) {
$allowed_keys = array_merge ( $allowed_keys , array_keys ( $meta_query_clauses ) );
}
$parsed = false ;
if ( $orderby == $this -> query_vars [ 'meta_key' ] || $orderby == 'meta_value' ) {
$parsed = " $wpdb->commentmeta .meta_value " ;
} else if ( $orderby == 'meta_value_num' ) {
$parsed = " $wpdb->commentmeta .meta_value+0 " ;
} else if ( in_array ( $orderby , $allowed_keys ) ) {
if ( isset ( $meta_query_clauses [ $orderby ] ) ) {
$meta_clause = $meta_query_clauses [ $orderby ];
$parsed = sprintf ( " CAST(%s.meta_value AS %s) " , esc_sql ( $meta_clause [ 'alias' ] ), esc_sql ( $meta_clause [ 'cast' ] ) );
} else {
$parsed = " $wpdb->comments . $orderby " ;
}
}
return $parsed ;
}
/**
* Parse an 'order' query variable and cast it to ASC or DESC as necessary .
*
* @ since 4.2 . 0
* @ access protected
*
* @ param string $order The 'order' query variable .
* @ return string The sanitized 'order' query variable .
*/
protected function parse_order ( $order ) {
if ( ! is_string ( $order ) || empty ( $order ) ) {
return 'DESC' ;
}
if ( 'ASC' === strtoupper ( $order ) ) {
return 'ASC' ;
} else {
return 'DESC' ;
}
}
2008-08-05 00:29:37 +02:00
}
/**
* Retrieve all of the WordPress supported comment statuses .
*
2008-09-22 05:39:41 +02:00
* Comments have a limited set of valid status values , this provides the comment
* status values and descriptions .
2008-08-05 00:29:37 +02:00
*
2008-09-22 05:39:41 +02:00
* @ since 2.7 . 0
2008-08-05 00:29:37 +02:00
*
* @ return array List of comment statuses .
*/
2013-01-04 11:13:51 +01:00
function get_comment_statuses () {
2008-08-05 00:29:37 +02:00
$status = array (
'hold' => __ ( 'Unapproved' ),
2009-03-11 00:02:29 +01:00
/* translators: comment status */
'approve' => _x ( 'Approved' , 'adjective' ),
/* translators: comment status */
'spam' => _x ( 'Spam' , 'adjective' ),
2008-08-05 00:29:37 +02:00
);
return $status ;
2006-04-19 04:32:12 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* The date the last comment was modified .
2008-01-04 21:03:42 +01:00
*
* @ since 1.5 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* @ param string $timezone Which timezone to use in reference to 'gmt' , 'blog' ,
2008-09-22 05:39:41 +02:00
* or 'server' locations .
* @ return string Last comment modified date .
2008-01-04 21:03:42 +01:00
*/
2006-04-19 04:32:12 +02:00
function get_lastcommentmodified ( $timezone = 'server' ) {
2012-06-29 22:57:09 +02:00
global $wpdb ;
static $cache_lastcommentmodified = array ();
2008-01-14 06:59:39 +01:00
if ( isset ( $cache_lastcommentmodified [ $timezone ]) )
return $cache_lastcommentmodified [ $timezone ];
2006-04-19 04:32:12 +02:00
$add_seconds_server = date ( 'Z' );
2008-01-14 06:59:39 +01:00
switch ( strtolower ( $timezone )) {
case 'gmt' :
2008-02-06 00:29:59 +01:00
$lastcommentmodified = $wpdb -> get_var ( " SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1 " );
2008-01-14 06:59:39 +01:00
break ;
case 'blog' :
2008-02-06 00:29:59 +01:00
$lastcommentmodified = $wpdb -> get_var ( " SELECT comment_date FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1 " );
2008-01-14 06:59:39 +01:00
break ;
case 'server' :
$lastcommentmodified = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT DATE_ADD(comment_date_gmt, INTERVAL %s SECOND) FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1 " , $add_seconds_server ));
break ;
2006-04-19 04:32:12 +02:00
}
2008-01-14 06:59:39 +01:00
$cache_lastcommentmodified [ $timezone ] = $lastcommentmodified ;
2006-04-19 04:32:12 +02:00
return $lastcommentmodified ;
2005-09-20 05:17:43 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* The amount of comments in a post or total comments .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* A lot like { @ link wp_count_comments ()}, in that they both return comment
* stats ( albeit with different types ) . The { @ link wp_count_comments ()} actual
* caches , but this function does not .
2008-01-04 21:03:42 +01:00
*
* @ since 2.0 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* @ param int $post_id Optional . Comment amount in post if > 0 , else total comments blog wide .
* @ return array The amount of spam , approved , awaiting moderation , and total comments .
2008-01-04 21:03:42 +01:00
*/
2008-01-01 19:40:39 +01:00
function get_comment_count ( $post_id = 0 ) {
2008-01-04 21:03:42 +01:00
global $wpdb ;
$post_id = ( int ) $post_id ;
$where = '' ;
if ( $post_id > 0 ) {
2008-04-14 18:13:25 +02:00
$where = $wpdb -> prepare ( " WHERE comment_post_ID = %d " , $post_id );
2008-01-04 21:03:42 +01:00
}
2008-02-05 07:47:27 +01:00
$totals = ( array ) $wpdb -> get_results ( "
SELECT comment_approved , COUNT ( * ) AS total
FROM { $wpdb -> comments }
{ $where }
GROUP BY comment_approved
2008-01-04 21:03:42 +01:00
" , ARRAY_A);
2008-02-05 07:47:27 +01:00
$comment_count = array (
" approved " => 0 ,
2008-01-04 21:03:42 +01:00
" awaiting_moderation " => 0 ,
" spam " => 0 ,
" total_comments " => 0
2008-02-05 07:47:27 +01:00
);
2008-01-04 21:03:42 +01:00
2008-02-05 07:47:27 +01:00
foreach ( $totals as $row ) {
switch ( $row [ 'comment_approved' ] ) {
case 'spam' :
$comment_count [ 'spam' ] = $row [ 'total' ];
2008-01-04 21:03:42 +01:00
$comment_count [ " total_comments " ] += $row [ 'total' ];
2008-02-05 07:47:27 +01:00
break ;
case 1 :
$comment_count [ 'approved' ] = $row [ 'total' ];
2008-01-04 21:03:42 +01:00
$comment_count [ 'total_comments' ] += $row [ 'total' ];
2008-02-05 07:47:27 +01:00
break ;
2008-01-04 21:03:42 +01:00
case 0 :
$comment_count [ 'awaiting_moderation' ] = $row [ 'total' ];
$comment_count [ 'total_comments' ] += $row [ 'total' ];
break ;
default :
break ;
}
}
2008-01-01 19:40:39 +01:00
2008-01-04 21:03:42 +01:00
return $comment_count ;
}
2008-01-01 19:40:39 +01:00
2009-09-17 22:17:33 +02:00
//
// Comment meta functions
//
/**
* Add meta data field to a comment .
*
2010-03-26 20:23:39 +01:00
* @ since 2.9 . 0
2009-09-17 22:17:33 +02:00
* @ link http :// codex . wordpress . org / Function_Reference / add_comment_meta
*
2009-12-16 23:13:53 +01:00
* @ param int $comment_id Comment ID .
2010-09-07 13:21:11 +02:00
* @ param string $meta_key Metadata name .
* @ param mixed $meta_value Metadata value .
2009-09-17 22:17:33 +02:00
* @ param bool $unique Optional , default is false . Whether the same key should not be added .
2013-06-21 14:45:11 +02:00
* @ return int | bool Meta ID on success , false on failure .
2009-09-17 22:17:33 +02:00
*/
function add_comment_meta ( $comment_id , $meta_key , $meta_value , $unique = false ) {
return add_metadata ( 'comment' , $comment_id , $meta_key , $meta_value , $unique );
}
/**
* Remove metadata matching criteria from a comment .
*
* You can match based on the key , or key and value . Removing based on key and
* value , will keep from removing duplicate metadata with the same key . It also
* allows removing all metadata matching key , if needed .
*
2010-03-26 20:23:39 +01:00
* @ since 2.9 . 0
2009-09-17 22:17:33 +02:00
* @ link http :// codex . wordpress . org / Function_Reference / delete_comment_meta
*
* @ param int $comment_id comment ID
* @ param string $meta_key Metadata name .
* @ param mixed $meta_value Optional . Metadata value .
2013-06-21 14:45:11 +02:00
* @ return bool True on success , false on failure .
2009-09-17 22:17:33 +02:00
*/
function delete_comment_meta ( $comment_id , $meta_key , $meta_value = '' ) {
return delete_metadata ( 'comment' , $comment_id , $meta_key , $meta_value );
}
/**
* Retrieve comment meta field for a comment .
*
2010-03-26 20:23:39 +01:00
* @ since 2.9 . 0
2009-09-17 22:17:33 +02:00
* @ link http :// codex . wordpress . org / Function_Reference / get_comment_meta
*
2009-12-16 23:13:53 +01:00
* @ param int $comment_id Comment ID .
2012-02-10 23:49:56 +01:00
* @ param string $key Optional . The meta key to retrieve . By default , returns data for all keys .
2009-09-17 22:17:33 +02:00
* @ param bool $single Whether to return a single value .
* @ return mixed Will be an array if $single is false . Will be value of meta data field if $single
* is true .
*/
2012-02-10 23:44:30 +01:00
function get_comment_meta ( $comment_id , $key = '' , $single = false ) {
2009-09-17 22:17:33 +02:00
return get_metadata ( 'comment' , $comment_id , $key , $single );
}
/**
* Update comment meta field based on comment ID .
*
* Use the $prev_value parameter to differentiate between meta fields with the
* same key and comment ID .
*
* If the meta field for the comment does not exist , it will be added .
*
2010-03-26 20:23:39 +01:00
* @ since 2.9 . 0
2009-09-17 22:17:33 +02:00
* @ link http :// codex . wordpress . org / Function_Reference / update_comment_meta
*
2009-12-16 23:13:53 +01:00
* @ param int $comment_id Comment ID .
2010-09-07 13:21:11 +02:00
* @ param string $meta_key Metadata key .
* @ param mixed $meta_value Metadata value .
2009-09-17 22:17:33 +02:00
* @ param mixed $prev_value Optional . Previous value to check before removing .
2014-02-18 22:36:14 +01:00
* @ return int | bool Meta ID if the key didn ' t exist , true on successful update , false on failure .
2009-09-17 22:17:33 +02:00
*/
function update_comment_meta ( $comment_id , $meta_key , $meta_value , $prev_value = '' ) {
return update_metadata ( 'comment' , $comment_id , $meta_key , $meta_value , $prev_value );
}
2012-02-27 20:46:52 +01:00
/**
* Sets the cookies used to store an unauthenticated commentator ' s identity . Typically used
* to recall previous comments by this commentator that are still held in moderation .
*
2011-12-21 11:57:42 +01:00
* @ param object $comment Comment object .
* @ param object $user Comment author ' s object .
*
* @ since 3.4 . 0
2012-02-27 20:46:52 +01:00
*/
function wp_set_comment_cookies ( $comment , $user ) {
2012-04-06 21:18:45 +02:00
if ( $user -> exists () )
2011-12-21 11:57:42 +01:00
return ;
2013-12-01 02:12:11 +01:00
/**
* Filter the lifetime of the comment cookie in seconds .
*
* @ since 2.8 . 0
*
* @ param int $seconds Comment cookie lifetime . Default 30000000.
*/
$comment_cookie_lifetime = apply_filters ( 'comment_cookie_lifetime' , 30000000 );
2014-07-27 19:46:17 +02:00
$secure = ( 'https' === parse_url ( home_url (), PHP_URL_SCHEME ) );
2014-06-29 15:25:16 +02:00
setcookie ( 'comment_author_' . COOKIEHASH , $comment -> comment_author , time () + $comment_cookie_lifetime , COOKIEPATH , COOKIE_DOMAIN , $secure );
setcookie ( 'comment_author_email_' . COOKIEHASH , $comment -> comment_author_email , time () + $comment_cookie_lifetime , COOKIEPATH , COOKIE_DOMAIN , $secure );
setcookie ( 'comment_author_url_' . COOKIEHASH , esc_url ( $comment -> comment_author_url ), time () + $comment_cookie_lifetime , COOKIEPATH , COOKIE_DOMAIN , $secure );
2012-02-27 20:46:52 +01:00
}
2011-12-21 11:57:42 +01:00
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Sanitizes the cookies sent to the user already .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* Will only do anything if the cookies have already been created for the user .
* Mostly used after cookies had been sent to use elsewhere .
2008-01-04 21:03:42 +01:00
*
* @ since 2.0 . 4
*/
2006-06-22 22:52:12 +02:00
function sanitize_comment_cookies () {
2013-12-01 02:12:11 +01:00
if ( isset ( $_COOKIE [ 'comment_author_' . COOKIEHASH ] ) ) {
/**
* Filter the comment author ' s name cookie before it is set .
*
* When this filter hook is evaluated in wp_filter_comment (),
* the comment author ' s name string is passed .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param string $author_cookie The comment author name cookie .
*/
$comment_author = apply_filters ( 'pre_comment_author_name' , $_COOKIE [ 'comment_author_' . COOKIEHASH ] );
2013-03-03 17:30:38 +01:00
$comment_author = wp_unslash ( $comment_author );
2009-05-05 21:43:53 +02:00
$comment_author = esc_attr ( $comment_author );
2013-12-01 02:12:11 +01:00
$_COOKIE [ 'comment_author_' . COOKIEHASH ] = $comment_author ;
2006-06-22 22:52:12 +02:00
}
2013-12-01 02:12:11 +01:00
if ( isset ( $_COOKIE [ 'comment_author_email_' . COOKIEHASH ] ) ) {
/**
* Filter the comment author ' s email cookie before it is set .
*
* When this filter hook is evaluated in wp_filter_comment (),
* the comment author ' s email string is passed .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param string $author_email_cookie The comment author email cookie .
*/
$comment_author_email = apply_filters ( 'pre_comment_author_email' , $_COOKIE [ 'comment_author_email_' . COOKIEHASH ] );
2013-03-03 17:30:38 +01:00
$comment_author_email = wp_unslash ( $comment_author_email );
2009-05-05 21:43:53 +02:00
$comment_author_email = esc_attr ( $comment_author_email );
2006-06-22 22:52:12 +02:00
$_COOKIE [ 'comment_author_email_' . COOKIEHASH ] = $comment_author_email ;
}
2013-12-01 02:12:11 +01:00
if ( isset ( $_COOKIE [ 'comment_author_url_' . COOKIEHASH ] ) ) {
/**
* Filter the comment author ' s URL cookie before it is set .
*
* When this filter hook is evaluated in wp_filter_comment (),
* the comment author ' s URL string is passed .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param string $author_url_cookie The comment author URL cookie .
*/
$comment_author_url = apply_filters ( 'pre_comment_author_url' , $_COOKIE [ 'comment_author_url_' . COOKIEHASH ] );
2013-03-03 17:30:38 +01:00
$comment_author_url = wp_unslash ( $comment_author_url );
2006-06-22 22:52:12 +02:00
$_COOKIE [ 'comment_author_url_' . COOKIEHASH ] = $comment_author_url ;
}
}
2008-01-04 21:03:42 +01:00
/**
2010-02-24 21:13:23 +01:00
* Validates whether this comment is allowed to be made .
2008-01-04 21:03:42 +01:00
*
* @ since 2.0 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
* @ param array $commentdata Contains information on the comment
* @ return mixed Signifies the approval status ( 0 | 1 | 'spam' )
*/
2014-05-15 20:10:15 +02:00
function wp_allow_comment ( $commentdata ) {
2005-09-20 05:17:43 +02:00
global $wpdb ;
// Simple duplicate check
2013-03-01 17:28:40 +01:00
// expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content)
2014-05-15 20:10:15 +02:00
$dupe = $wpdb -> prepare (
" SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s " ,
wp_unslash ( $commentdata [ 'comment_post_ID' ] ),
wp_unslash ( $commentdata [ 'comment_parent' ] ),
wp_unslash ( $commentdata [ 'comment_author' ] )
);
if ( $commentdata [ 'comment_author_email' ] ) {
$dupe .= $wpdb -> prepare (
" OR comment_author_email = %s " ,
wp_unslash ( $commentdata [ 'comment_author_email' ] )
);
}
$dupe .= $wpdb -> prepare (
" ) AND comment_content = %s LIMIT 1 " ,
wp_unslash ( $commentdata [ 'comment_content' ] )
);
if ( $wpdb -> get_var ( $dupe ) ) {
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a duplicate comment is detected .
*
* @ since 3.0 . 0
*
* @ param array $commentdata Comment data .
*/
2010-02-26 20:06:09 +01:00
do_action ( 'comment_duplicate_trigger' , $commentdata );
2014-05-15 20:10:15 +02:00
if ( defined ( 'DOING_AJAX' ) ) {
2009-05-05 06:28:05 +02:00
die ( __ ( 'Duplicate comment detected; it looks as though you’ve already said that!' ) );
2014-05-15 20:10:15 +02:00
}
2014-11-26 21:17:24 +01:00
wp_die ( __ ( 'Duplicate comment detected; it looks as though you’ve already said that!' ), 409 );
2008-08-24 08:56:22 +02:00
}
2005-09-20 05:17:43 +02:00
2013-12-01 02:12:11 +01:00
/**
* Fires immediately before a comment is marked approved .
*
* Allows checking for comment flooding .
*
* @ since 2.3 . 0
*
* @ param string $comment_author_IP Comment author ' s IP address .
* @ param string $comment_author_email Comment author ' s email .
* @ param string $comment_date_gmt GMT date the comment was posted .
*/
2014-05-15 20:10:15 +02:00
do_action (
'check_comment_flood' ,
$commentdata [ 'comment_author_IP' ],
$commentdata [ 'comment_author_email' ],
$commentdata [ 'comment_date_gmt' ]
);
2005-09-20 05:17:43 +02:00
2014-05-15 20:10:15 +02:00
if ( ! empty ( $commentdata [ 'user_id' ] ) ) {
$user = get_userdata ( $commentdata [ 'user_id' ] );
$post_author = $wpdb -> get_var ( $wpdb -> prepare (
" SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1 " ,
$commentdata [ 'comment_post_ID' ]
) );
2005-09-20 05:17:43 +02:00
}
2014-05-15 20:10:15 +02:00
if ( isset ( $user ) && ( $commentdata [ 'user_id' ] == $post_author || $user -> has_cap ( 'moderate_comments' ) ) ) {
2006-12-07 04:57:23 +01:00
// The author and the admins get respect.
2005-09-20 05:17:43 +02:00
$approved = 1 ;
2013-12-01 02:12:11 +01:00
} else {
2006-12-07 04:57:23 +01:00
// Everyone else's comments will be checked.
2014-05-15 20:10:15 +02:00
if ( check_comment (
$commentdata [ 'comment_author' ],
$commentdata [ 'comment_author_email' ],
$commentdata [ 'comment_author_url' ],
$commentdata [ 'comment_content' ],
$commentdata [ 'comment_author_IP' ],
$commentdata [ 'comment_agent' ],
$commentdata [ 'comment_type' ]
) ) {
2005-09-20 05:17:43 +02:00
$approved = 1 ;
2014-05-15 20:10:15 +02:00
} else {
2005-09-20 05:17:43 +02:00
$approved = 0 ;
2014-05-15 20:10:15 +02:00
}
2014-05-16 20:52:16 +02:00
2014-05-15 20:10:15 +02:00
if ( wp_blacklist_check (
$commentdata [ 'comment_author' ],
$commentdata [ 'comment_author_email' ],
$commentdata [ 'comment_author_url' ],
$commentdata [ 'comment_content' ],
$commentdata [ 'comment_author_IP' ],
$commentdata [ 'comment_agent' ]
) ) {
2005-09-20 05:17:43 +02:00
$approved = 'spam' ;
2014-05-15 20:10:15 +02:00
}
2005-09-20 05:17:43 +02:00
}
2013-12-01 02:12:11 +01:00
/**
* Filter a comment ' s approval status before it is set .
*
* @ since 2.1 . 0
*
* @ param bool | string $approved The approval status . Accepts 1 , 0 , or 'spam' .
* @ param array $commentdata Comment data .
*/
2010-09-07 16:36:35 +02:00
$approved = apply_filters ( 'pre_comment_approved' , $approved , $commentdata );
2005-09-20 05:17:43 +02:00
return $approved ;
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Check whether comment flooding is occurring .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* Won ' t run , if current user can manage options , so to not block
* administrators .
2008-01-04 21:03:42 +01:00
*
* @ since 2.3 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-09-22 05:39:41 +02:00
*
* @ param string $ip Comment IP .
* @ param string $email Comment author email address .
* @ param string $date MySQL time string .
2008-01-04 21:03:42 +01:00
*/
2007-08-27 08:34:18 +02:00
function check_comment_flood_db ( $ip , $email , $date ) {
global $wpdb ;
2008-03-20 21:32:18 +01:00
if ( current_user_can ( 'manage_options' ) )
return ; // don't throttle admins
2012-09-25 07:26:19 +02:00
$hour_ago = gmdate ( 'Y-m-d H:i:s' , time () - HOUR_IN_SECONDS );
2009-12-12 00:29:19 +01:00
if ( $lasttime = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT `comment_date_gmt` FROM ` $wpdb->comments ` WHERE `comment_date_gmt` >= %s AND ( `comment_author_IP` = %s OR `comment_author_email` = %s ) ORDER BY `comment_date_gmt` DESC LIMIT 1 " , $hour_ago , $ip , $email ) ) ) {
2009-05-14 04:00:32 +02:00
$time_lastcomment = mysql2date ( 'U' , $lasttime , false );
$time_newcomment = mysql2date ( 'U' , $date , false );
2013-12-01 02:12:11 +01:00
/**
* Filter the comment flood status .
*
* @ since 2.1 . 0
*
* @ param bool $bool Whether a comment flood is occurring . Default false .
* @ param int $time_lastcomment Timestamp of when the last comment was posted .
* @ param int $time_newcomment Timestamp of when the new comment was posted .
*/
$flood_die = apply_filters ( 'comment_flood_filter' , false , $time_lastcomment , $time_newcomment );
2007-08-27 08:34:18 +02:00
if ( $flood_die ) {
2013-12-01 02:12:11 +01:00
/**
* Fires before the comment flood message is triggered .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param int $time_lastcomment Timestamp of when the last comment was posted .
* @ param int $time_newcomment Timestamp of when the new comment was posted .
*/
do_action ( 'comment_flood_trigger' , $time_lastcomment , $time_newcomment );
2008-08-24 08:56:22 +02:00
if ( defined ( 'DOING_AJAX' ) )
2011-12-14 00:45:31 +01:00
die ( __ ( 'You are posting comments too quickly. Slow down.' ) );
2008-08-24 08:56:22 +02:00
2014-11-26 21:17:24 +01:00
wp_die ( __ ( 'You are posting comments too quickly. Slow down.' ), 429 );
2007-08-27 08:34:18 +02:00
}
}
}
2006-12-07 04:57:23 +01:00
2008-09-16 02:23:38 +02:00
/**
* Separates an array of comments into an array keyed by comment_type .
*
2008-09-22 05:39:41 +02:00
* @ since 2.7 . 0
2008-09-16 02:23:38 +02:00
*
* @ param array $comments Array of comments
* @ return array Array of comments keyed by comment_type .
*/
2012-09-10 19:00:11 +02:00
function separate_comments ( & $comments ) {
2008-09-16 02:23:38 +02:00
$comments_by_type = array ( 'comment' => array (), 'trackback' => array (), 'pingback' => array (), 'pings' => array ());
$count = count ( $comments );
for ( $i = 0 ; $i < $count ; $i ++ ) {
$type = $comments [ $i ] -> comment_type ;
2008-09-30 21:49:26 +02:00
if ( empty ( $type ) )
$type = 'comment' ;
2008-09-16 02:23:38 +02:00
$comments_by_type [ $type ][] = & $comments [ $i ];
if ( 'trackback' == $type || 'pingback' == $type )
$comments_by_type [ 'pings' ][] = & $comments [ $i ];
}
return $comments_by_type ;
}
2008-10-23 18:08:47 +02:00
/**
* Calculate the total number of comment pages .
*
* @ since 2.7 . 0
2013-12-24 17:43:14 +01:00
*
2008-10-28 08:29:04 +01:00
* @ uses Walker_Comment
2008-10-23 18:08:47 +02:00
*
2011-12-14 00:45:31 +01:00
* @ param array $comments Optional array of comment objects . Defaults to $wp_query -> comments
2008-10-23 18:08:47 +02:00
* @ param int $per_page Optional comments per page .
* @ param boolean $threaded Optional control over flat or threaded comments .
* @ return int Number of comment pages .
*/
function get_comment_pages_count ( $comments = null , $per_page = null , $threaded = null ) {
global $wp_query ;
2008-12-07 05:49:22 +01:00
if ( null === $comments && null === $per_page && null === $threaded && ! empty ( $wp_query -> max_num_comment_pages ) )
return $wp_query -> max_num_comment_pages ;
2014-01-29 06:17:12 +01:00
if ( ( ! $comments || ! is_array ( $comments ) ) && ! empty ( $wp_query -> comments ) )
2008-10-23 18:08:47 +02:00
$comments = $wp_query -> comments ;
if ( empty ( $comments ) )
return 0 ;
2013-08-26 20:52:08 +02:00
if ( ! get_option ( 'page_comments' ) )
return 1 ;
2008-10-23 18:08:47 +02:00
if ( ! isset ( $per_page ) )
$per_page = ( int ) get_query_var ( 'comments_per_page' );
if ( 0 === $per_page )
$per_page = ( int ) get_option ( 'comments_per_page' );
if ( 0 === $per_page )
return 1 ;
if ( ! isset ( $threaded ) )
$threaded = get_option ( 'thread_comments' );
if ( $threaded ) {
$walker = new Walker_Comment ;
$count = ceil ( $walker -> get_number_of_root_elements ( $comments ) / $per_page );
} else {
$count = ceil ( count ( $comments ) / $per_page );
}
return $count ;
}
2008-10-27 17:31:26 +01:00
/**
* Calculate what page number a comment will appear on for comment paging .
*
* @ since 2.7 . 0
*
* @ param int $comment_ID Comment ID .
2008-11-20 07:41:55 +01:00
* @ param array $args Optional args .
2008-10-27 17:31:26 +01:00
* @ return int | null Comment page number or null on error .
*/
2008-11-20 07:41:55 +01:00
function get_page_of_comment ( $comment_ID , $args = array () ) {
2008-11-05 08:09:20 +01:00
global $wpdb ;
2008-10-28 08:29:04 +01:00
if ( ! $comment = get_comment ( $comment_ID ) )
2008-10-27 17:31:26 +01:00
return ;
2008-11-20 07:41:55 +01:00
$defaults = array ( 'type' => 'all' , 'page' => '' , 'per_page' => '' , 'max_depth' => '' );
$args = wp_parse_args ( $args , $defaults );
2008-10-27 17:31:26 +01:00
2008-11-20 07:41:55 +01:00
if ( '' === $args [ 'per_page' ] && get_option ( 'page_comments' ) )
$args [ 'per_page' ] = get_query_var ( 'comments_per_page' );
if ( empty ( $args [ 'per_page' ]) ) {
$args [ 'per_page' ] = 0 ;
$args [ 'page' ] = 0 ;
}
if ( $args [ 'per_page' ] < 1 )
return 1 ;
2008-10-27 17:31:26 +01:00
2008-11-20 07:41:55 +01:00
if ( '' === $args [ 'max_depth' ] ) {
if ( get_option ( 'thread_comments' ) )
$args [ 'max_depth' ] = get_option ( 'thread_comments_depth' );
else
$args [ 'max_depth' ] = - 1 ;
}
2008-10-27 17:31:26 +01:00
2008-10-28 08:17:29 +01:00
// Find this comment's top level parent if threading is enabled
2008-11-20 07:41:55 +01:00
if ( $args [ 'max_depth' ] > 1 && 0 != $comment -> comment_parent )
return get_page_of_comment ( $comment -> comment_parent , $args );
$allowedtypes = array (
'comment' => '' ,
'pingback' => 'pingback' ,
'trackback' => 'trackback' ,
);
$comtypewhere = ( 'all' != $args [ 'type' ] && isset ( $allowedtypes [ $args [ 'type' ]]) ) ? " AND comment_type = ' " . $allowedtypes [ $args [ 'type' ]] . " ' " : '' ;
2008-10-28 08:29:04 +01:00
2008-11-05 08:09:20 +01:00
// Count comments older than this one
2009-01-28 19:43:08 +01:00
$oldercoms = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_approved = '1' AND comment_date_gmt < '%s' " . $comtypewhere , $comment -> comment_post_ID , $comment -> comment_date_gmt ) );
2008-10-27 17:31:26 +01:00
2008-11-05 08:09:20 +01:00
// No older comments? Then it's page #1.
if ( 0 == $oldercoms )
return 1 ;
2008-10-27 17:31:26 +01:00
2008-11-05 08:09:20 +01:00
// Divide comments older than this one by comments per page to get this comment's page number
2008-11-20 07:41:55 +01:00
return ceil ( ( $oldercoms + 1 ) / $args [ 'per_page' ] );
2008-10-27 17:31:26 +01:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Does comment contain blacklisted characters or words .
2008-01-04 21:03:42 +01:00
*
* @ since 1.5 . 0
*
* @ param string $author The author of the comment
* @ param string $email The email of the comment
* @ param string $url The url used in the comment
* @ param string $comment The comment content
* @ param string $user_ip The comment author IP address
* @ param string $user_agent The author ' s browser user agent
* @ return bool True if comment contains blacklisted content , false if comment does not
*/
2006-06-08 01:17:59 +02:00
function wp_blacklist_check ( $author , $email , $url , $comment , $user_ip , $user_agent ) {
2013-12-01 02:12:11 +01:00
/**
* Fires before the comment is tested for blacklisted characters or words .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param string $author Comment author .
* @ param string $email Comment author ' s email .
* @ param string $url Comment author ' s URL .
* @ param string $comment Comment content .
* @ param string $user_ip Comment author ' s IP address .
* @ param string $user_agent Comment author ' s browser user agent .
*/
do_action ( 'wp_blacklist_check' , $author , $email , $url , $comment , $user_ip , $user_agent );
2006-06-08 01:17:59 +02:00
2006-08-30 23:46:31 +02:00
$mod_keys = trim ( get_option ( 'blacklist_keys' ) );
2006-12-07 04:57:23 +01:00
if ( '' == $mod_keys )
2006-06-08 01:17:59 +02:00
return false ; // If moderation keys are empty
$words = explode ( " \n " , $mod_keys );
2006-12-07 04:57:23 +01:00
foreach ( ( array ) $words as $word ) {
2006-06-08 01:17:59 +02:00
$word = trim ( $word );
// Skip empty lines
if ( empty ( $word ) ) { continue ; }
2006-11-19 08:56:05 +01:00
// Do some escaping magic so that '#' chars in the
2006-06-08 01:17:59 +02:00
// spam words don't break things:
$word = preg_quote ( $word , '#' );
2006-11-19 08:56:05 +01:00
$pattern = " # $word #i " ;
2006-12-07 04:57:23 +01:00
if (
preg_match ( $pattern , $author )
|| preg_match ( $pattern , $email )
|| preg_match ( $pattern , $url )
|| preg_match ( $pattern , $comment )
|| preg_match ( $pattern , $user_ip )
|| preg_match ( $pattern , $user_agent )
)
return true ;
2006-06-08 01:17:59 +02:00
}
return false ;
}
2008-06-15 11:34:00 +02:00
/**
2008-09-22 05:39:41 +02:00
* Retrieve total comments for blog or single post .
2008-06-15 11:34:00 +02:00
*
2008-09-22 05:39:41 +02:00
* The properties of the returned object contain the 'moderated' , 'approved' ,
* and spam comments for either the entire blog or single post . Those properties
* contain the amount of comments that match the status . The 'total_comments'
* property contains the integer of total comments .
2008-06-15 11:34:00 +02:00
*
2008-09-22 05:39:41 +02:00
* The comment stats are cached and then retrieved , if they already exist in the
* cache .
*
* @ since 2.5 . 0
*
* @ param int $post_id Optional . Post ID .
* @ return object Comment stats .
2008-06-15 11:34:00 +02:00
*/
2008-05-01 18:52:48 +02:00
function wp_count_comments ( $post_id = 0 ) {
2008-02-23 09:33:44 +01:00
global $wpdb ;
2008-05-01 18:52:48 +02:00
$post_id = ( int ) $post_id ;
2013-12-01 02:12:11 +01:00
/**
* Filter the comments count for a given post .
*
* @ since 2.7 . 0
*
* @ param array $count An empty array .
* @ param int $post_id The post ID .
*/
$stats = apply_filters ( 'wp_count_comments' , array (), $post_id );
2008-12-06 00:40:09 +01:00
if ( ! empty ( $stats ) )
return $stats ;
2008-05-02 21:42:44 +02:00
$count = wp_cache_get ( " comments- { $post_id } " , 'counts' );
2008-04-17 01:45:39 +02:00
if ( false !== $count )
return $count ;
2009-10-27 16:51:58 +01:00
$where = '' ;
if ( $post_id > 0 )
2009-10-28 04:10:59 +01:00
$where = $wpdb -> prepare ( " WHERE comment_post_ID = %d " , $post_id );
2008-05-01 18:52:48 +02:00
2009-10-27 16:51:58 +01:00
$count = $wpdb -> get_results ( " SELECT comment_approved, COUNT( * ) AS num_comments FROM { $wpdb -> comments } { $where } GROUP BY comment_approved " , ARRAY_A );
2008-02-23 09:33:44 +01:00
2008-05-01 18:52:48 +02:00
$total = 0 ;
2009-11-05 22:03:09 +01:00
$approved = array ( '0' => 'moderated' , '1' => 'approved' , 'spam' => 'spam' , 'trash' => 'trash' , 'post-trashed' => 'post-trashed' );
2010-02-20 03:01:46 +01:00
foreach ( ( array ) $count as $row ) {
2009-11-05 22:03:09 +01:00
// Don't count post-trashed toward totals
2009-11-13 06:39:17 +01:00
if ( 'post-trashed' != $row [ 'comment_approved' ] && 'trash' != $row [ 'comment_approved' ] )
2009-11-05 22:03:09 +01:00
$total += $row [ 'num_comments' ];
2011-05-04 20:46:03 +02:00
if ( isset ( $approved [ $row [ 'comment_approved' ]] ) )
2008-12-09 09:07:52 +01:00
$stats [ $approved [ $row [ 'comment_approved' ]]] = $row [ 'num_comments' ];
2008-02-23 09:33:44 +01:00
}
2008-05-01 18:52:48 +02:00
$stats [ 'total_comments' ] = $total ;
2008-02-23 09:33:44 +01:00
foreach ( $approved as $key ) {
if ( empty ( $stats [ $key ]) )
$stats [ $key ] = 0 ;
}
2008-04-17 01:45:39 +02:00
$stats = ( object ) $stats ;
2008-05-02 21:42:44 +02:00
wp_cache_set ( " comments- { $post_id } " , $stats , 'counts' );
2008-04-17 01:45:39 +02:00
return $stats ;
2008-02-23 09:33:44 +01:00
}
2008-01-04 21:03:42 +01:00
/**
2010-04-04 14:20:19 +02:00
* 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 .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* The post comment count will be updated if the comment was approved and has a
* post ID available .
2008-01-04 21:03:42 +01:00
*
* @ since 2.0 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
* @ param int $comment_id Comment ID
2010-04-04 14:20:19 +02:00
* @ param bool $force_delete Whether to bypass trash and force deletion . Default is false .
2013-06-21 14:45:11 +02:00
* @ return bool True on success , false on failure .
2008-01-04 21:03:42 +01:00
*/
2010-04-04 14:20:19 +02:00
function wp_delete_comment ( $comment_id , $force_delete = false ) {
2005-11-16 07:29:36 +01:00
global $wpdb ;
2009-07-30 15:39:34 +02:00
if ( ! $comment = get_comment ( $comment_id ))
return false ;
2010-04-04 14:20:19 +02:00
if ( ! $force_delete && EMPTY_TRASH_DAYS && ! in_array ( wp_get_comment_status ( $comment_id ), array ( 'trash' , 'spam' ) ) )
2009-07-30 15:39:34 +02:00
return wp_trash_comment ( $comment_id );
2009-09-14 16:03:32 +02:00
2013-12-01 02:12:11 +01:00
/**
* Fires immediately before a comment is deleted from the database .
*
2013-12-01 02:25:10 +01:00
* @ since 1.2 . 0
2013-12-01 02:12:11 +01:00
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'delete_comment' , $comment_id );
2009-09-14 16:03:32 +02:00
2009-03-10 20:02:27 +01:00
// Move children up a level.
$children = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT comment_ID FROM $wpdb->comments WHERE comment_parent = %d " , $comment_id ) );
if ( ! empty ( $children ) ) {
$wpdb -> update ( $wpdb -> comments , array ( 'comment_parent' => $comment -> comment_parent ), array ( 'comment_parent' => $comment_id ));
clean_comment_cache ( $children );
}
2009-12-17 18:10:40 +01:00
// Delete metadata
2012-04-11 22:02:39 +02:00
$meta_ids = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT meta_id FROM $wpdb->commentmeta WHERE comment_id = %d " , $comment_id ) );
foreach ( $meta_ids as $mid )
delete_metadata_by_mid ( 'comment' , $mid );
2009-12-17 18:10:40 +01:00
2012-03-24 16:24:31 +01:00
if ( ! $wpdb -> delete ( $wpdb -> comments , array ( 'comment_ID' => $comment_id ) ) )
2009-12-17 18:54:23 +01:00
return false ;
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a comment is deleted from the database .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'deleted_comment' , $comment_id );
2009-12-17 18:54:23 +01:00
2005-11-16 07:29:36 +01:00
$post_id = $comment -> comment_post_ID ;
2005-12-05 06:31:27 +01:00
if ( $post_id && $comment -> comment_approved == 1 )
2006-06-19 19:17:52 +02:00
wp_update_comment_count ( $post_id );
2005-11-16 07:29:36 +01:00
2007-06-08 02:20:22 +02:00
clean_comment_cache ( $comment_id );
2014-04-25 08:55:14 +02:00
/** This action is documented in wp-includes/comment.php */
2013-12-01 02:12:11 +01:00
do_action ( 'wp_set_comment_status' , $comment_id , 'delete' );
2014-04-25 08:55:14 +02:00
2008-10-16 06:18:45 +02:00
wp_transition_comment_status ( 'delete' , $comment -> comment_approved , $comment );
2005-11-16 07:29:36 +01:00
return true ;
2005-09-20 05:17:43 +02:00
}
2009-07-30 15:39:34 +02:00
/**
* Moves a comment to the Trash
*
2010-04-04 14:20:19 +02:00
* If trash is disabled , comment is permanently deleted .
*
2009-07-30 15:39:34 +02:00
* @ since 2.9 . 0
2013-12-24 17:43:14 +01:00
*
2009-07-30 15:39:34 +02:00
* @ param int $comment_id Comment ID .
2013-06-21 14:45:11 +02:00
* @ return bool True on success , false on failure .
2009-07-30 15:39:34 +02:00
*/
2009-10-05 03:49:19 +02:00
function wp_trash_comment ( $comment_id ) {
2010-04-04 14:20:19 +02:00
if ( ! EMPTY_TRASH_DAYS )
return wp_delete_comment ( $comment_id , true );
2009-07-30 15:39:34 +02:00
2009-10-05 03:49:19 +02:00
if ( ! $comment = get_comment ( $comment_id ) )
2009-07-30 15:39:34 +02:00
return false ;
2013-12-01 02:12:11 +01:00
/**
* Fires immediately before a comment is sent to the Trash .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'trash_comment' , $comment_id );
2009-07-30 15:39:34 +02:00
2009-11-27 11:34:09 +01:00
if ( wp_set_comment_status ( $comment_id , 'trash' ) ) {
add_comment_meta ( $comment_id , '_wp_trash_meta_status' , $comment -> comment_approved );
add_comment_meta ( $comment_id , '_wp_trash_meta_time' , time () );
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a comment is sent to Trash .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'trashed_comment' , $comment_id );
2009-11-27 11:34:09 +01:00
return true ;
}
2009-07-30 15:39:34 +02:00
2009-11-27 11:34:09 +01:00
return false ;
2009-07-30 15:39:34 +02:00
}
/**
* Removes a comment from the Trash
*
* @ since 2.9 . 0
*
* @ param int $comment_id Comment ID .
2013-06-21 14:45:11 +02:00
* @ return bool True on success , false on failure .
2009-07-30 15:39:34 +02:00
*/
2009-10-05 03:49:19 +02:00
function wp_untrash_comment ( $comment_id ) {
if ( ! ( int ) $comment_id )
return false ;
2013-12-01 02:12:11 +01:00
/**
* Fires immediately before a comment is restored from the Trash .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'untrash_comment' , $comment_id );
2009-07-30 15:39:34 +02:00
2009-11-28 04:56:20 +01:00
$status = ( string ) get_comment_meta ( $comment_id , '_wp_trash_meta_status' , true );
2009-10-08 10:24:59 +02:00
if ( empty ( $status ) )
2009-10-05 03:49:19 +02:00
$status = '0' ;
2009-11-28 04:56:20 +01:00
if ( wp_set_comment_status ( $comment_id , $status ) ) {
2009-11-27 11:34:09 +01:00
delete_comment_meta ( $comment_id , '_wp_trash_meta_time' );
delete_comment_meta ( $comment_id , '_wp_trash_meta_status' );
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a comment is restored from the Trash .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'untrashed_comment' , $comment_id );
2009-11-27 11:34:09 +01:00
return true ;
}
2009-10-05 03:49:19 +02:00
2009-11-27 11:34:09 +01:00
return false ;
}
2009-10-05 03:49:19 +02:00
2009-11-27 11:34:09 +01:00
/**
* Marks a comment as Spam
*
* @ since 2.9 . 0
*
* @ param int $comment_id Comment ID .
2013-06-21 14:45:11 +02:00
* @ return bool True on success , false on failure .
2009-11-27 11:34:09 +01:00
*/
function wp_spam_comment ( $comment_id ) {
if ( ! $comment = get_comment ( $comment_id ) )
return false ;
2009-07-30 15:39:34 +02:00
2013-12-01 02:12:11 +01:00
/**
* Fires immediately before a comment is marked as Spam .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'spam_comment' , $comment_id );
2009-11-27 11:34:09 +01:00
if ( wp_set_comment_status ( $comment_id , 'spam' ) ) {
add_comment_meta ( $comment_id , '_wp_trash_meta_status' , $comment -> comment_approved );
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a comment is marked as Spam .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'spammed_comment' , $comment_id );
2009-11-27 11:34:09 +01:00
return true ;
}
return false ;
}
/**
* Removes a comment from the Spam
*
* @ since 2.9 . 0
*
* @ param int $comment_id Comment ID .
2013-06-21 14:45:11 +02:00
* @ return bool True on success , false on failure .
2009-11-27 11:34:09 +01:00
*/
function wp_unspam_comment ( $comment_id ) {
if ( ! ( int ) $comment_id )
return false ;
2013-12-01 02:12:11 +01:00
/**
* Fires immediately before a comment is unmarked as Spam .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'unspam_comment' , $comment_id );
2009-11-27 11:34:09 +01:00
2009-11-28 04:56:20 +01:00
$status = ( string ) get_comment_meta ( $comment_id , '_wp_trash_meta_status' , true );
2009-11-27 11:34:09 +01:00
if ( empty ( $status ) )
$status = '0' ;
2009-11-28 04:56:20 +01:00
if ( wp_set_comment_status ( $comment_id , $status ) ) {
2009-11-27 11:34:09 +01:00
delete_comment_meta ( $comment_id , '_wp_trash_meta_status' );
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a comment is unmarked as Spam .
*
* @ since 2.9 . 0
*
* @ param int $comment_id The comment ID .
*/
do_action ( 'unspammed_comment' , $comment_id );
2009-11-27 11:34:09 +01:00
return true ;
}
return false ;
2009-07-30 15:39:34 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* The status of a comment by ID .
2008-01-04 21:03:42 +01:00
*
* @ since 1.0 . 0
*
* @ param int $comment_id Comment ID
2014-12-01 02:34:24 +01:00
* @ return false | string Status might be 'trash' , 'approved' , 'unapproved' , 'spam' . False on failure .
2008-01-04 21:03:42 +01:00
*/
2006-04-19 04:32:12 +02:00
function wp_get_comment_status ( $comment_id ) {
2007-06-08 02:20:22 +02:00
$comment = get_comment ( $comment_id );
if ( ! $comment )
return false ;
$approved = $comment -> comment_approved ;
2006-12-07 04:57:23 +01:00
2012-01-05 21:50:54 +01:00
if ( $approved == null )
2009-07-30 15:39:34 +02:00
return false ;
2007-06-08 02:20:22 +02:00
elseif ( $approved == '1' )
2006-04-19 04:32:12 +02:00
return 'approved' ;
2007-06-08 02:20:22 +02:00
elseif ( $approved == '0' )
2006-04-19 04:32:12 +02:00
return 'unapproved' ;
2007-06-08 02:20:22 +02:00
elseif ( $approved == 'spam' )
2006-04-19 04:32:12 +02:00
return 'spam' ;
2009-07-30 15:39:34 +02:00
elseif ( $approved == 'trash' )
return 'trash' ;
2006-12-07 04:57:23 +01:00
else
2006-04-19 04:32:12 +02:00
return false ;
2004-12-16 03:57:05 +01:00
}
2008-10-16 06:18:45 +02:00
/**
* Call hooks for when a comment status transition occurs .
*
* Calls hooks for comment status transitions . If the new comment status is not the same
* as the previous comment status , then two hooks will be ran , the first is
* 'transition_comment_status' with new status , old status , and comment data . The
* next action called is 'comment_OLDSTATUS_to_NEWSTATUS' the NEWSTATUS is the
* $new_status parameter and the OLDSTATUS is $old_status parameter ; it has the
* comment data .
*
* The final action will run whether or not the comment statuses are the same . The
* action is named 'comment_NEWSTATUS_COMMENTTYPE' , NEWSTATUS is from the $new_status
* parameter and COMMENTTYPE is comment_type comment data .
*
* @ since 2.7 . 0
*
* @ param string $new_status New comment status .
* @ param string $old_status Previous comment status .
* @ param object $comment Comment data .
*/
function wp_transition_comment_status ( $new_status , $old_status , $comment ) {
2013-12-01 02:12:11 +01:00
/*
* Translate raw statuses to human readable formats for the hooks .
* This is not a complete list of comment status , it ' s only the ones
* that need to be renamed
*/
2008-10-16 06:18:45 +02:00
$comment_statuses = array (
0 => 'unapproved' ,
'hold' => 'unapproved' , // wp_set_comment_status() uses "hold"
1 => 'approved' ,
'approve' => 'approved' , // wp_set_comment_status() uses "approve"
);
if ( isset ( $comment_statuses [ $new_status ]) ) $new_status = $comment_statuses [ $new_status ];
if ( isset ( $comment_statuses [ $old_status ]) ) $old_status = $comment_statuses [ $old_status ];
// Call the hooks
if ( $new_status != $old_status ) {
2013-12-01 02:12:11 +01:00
/**
* Fires when the comment status is in transition .
*
* @ since 2.7 . 0
*
* @ param int | string $new_status The new comment status .
* @ param int | string $old_status The old comment status .
* @ param object $comment The comment data .
*/
do_action ( 'transition_comment_status' , $new_status , $old_status , $comment );
/**
* Fires when the comment status is in transition from one specific status to another .
*
2014-11-30 13:10:23 +01:00
* The dynamic portions of the hook name , `$old_status` , and `$new_status` ,
2013-12-01 02:12:11 +01:00
* refer to the old and new comment statuses , respectively .
*
* @ since 2.7 . 0
*
* @ param object $comment Comment object .
*/
do_action ( " comment_ { $old_status } _to_ { $new_status } " , $comment );
2008-10-16 06:18:45 +02:00
}
2013-12-01 02:12:11 +01:00
/**
* Fires when the status of a specific comment type is in transition .
*
2014-11-30 13:10:23 +01:00
* The dynamic portions of the hook name , `$new_status` , and `$comment->comment_type` ,
2013-12-01 02:12:11 +01:00
* refer to the new comment status , and the type of comment , respectively .
*
* Typical comment types include an empty string ( standard comment ), 'pingback' ,
* or 'trackback' .
*
* @ since 2.7 . 0
*
* @ param int $comment_ID The comment ID .
* @ param obj $comment Comment object .
*/
do_action ( " comment_ { $new_status } _ { $comment -> comment_type } " , $comment -> comment_ID , $comment );
2008-10-16 06:18:45 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Get current commenter ' s name , email , and URL .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* Expects cookies content to already be sanitized . User of this function might
* wish to recheck the returned array for validity .
2008-01-04 21:03:42 +01:00
*
* @ see sanitize_comment_cookies () Use to sanitize cookies
*
* @ since 2.0 . 4
*
2008-09-22 05:39:41 +02:00
* @ return array Comment author , email , url respectively .
2008-01-04 21:03:42 +01:00
*/
2006-06-22 22:52:12 +02:00
function wp_get_current_commenter () {
// Cookies should already be sanitized.
$comment_author = '' ;
if ( isset ( $_COOKIE [ 'comment_author_' . COOKIEHASH ]) )
$comment_author = $_COOKIE [ 'comment_author_' . COOKIEHASH ];
$comment_author_email = '' ;
if ( isset ( $_COOKIE [ 'comment_author_email_' . COOKIEHASH ]) )
$comment_author_email = $_COOKIE [ 'comment_author_email_' . COOKIEHASH ];
$comment_author_url = '' ;
if ( isset ( $_COOKIE [ 'comment_author_url_' . COOKIEHASH ]) )
$comment_author_url = $_COOKIE [ 'comment_author_url_' . COOKIEHASH ];
2013-12-01 02:12:11 +01:00
/**
* Filter the current commenter ' s name , email , and URL .
*
* @ since 3.1 . 0
*
* @ param string $comment_author Comment author ' s name .
* @ param string $comment_author_email Comment author ' s email .
* @ param string $comment_author_url Comment author ' s URL .
*/
return apply_filters ( 'wp_get_current_commenter' , compact ( 'comment_author' , 'comment_author_email' , 'comment_author_url' ) );
2006-06-22 22:52:12 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Inserts a comment to the database .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* The available comment data key names are 'comment_author_IP' , 'comment_date' ,
* 'comment_date_gmt' , 'comment_parent' , 'comment_approved' , and 'user_id' .
2008-01-04 21:03:42 +01:00
*
* @ since 2.0 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* @ param array $commentdata Contains information on the comment .
2014-06-05 06:38:14 +02:00
* @ return int | bool The new comment ' s ID on success , false on failure .
2008-01-04 21:03:42 +01:00
*/
2014-05-16 20:52:16 +02:00
function wp_insert_comment ( $commentdata ) {
2006-04-19 04:32:12 +02:00
global $wpdb ;
2014-05-16 20:52:16 +02:00
$data = wp_unslash ( $commentdata );
2004-12-16 03:57:05 +01:00
2014-05-16 20:52:16 +02:00
$comment_author = ! isset ( $data [ 'comment_author' ] ) ? '' : $data [ 'comment_author' ];
$comment_author_email = ! isset ( $data [ 'comment_author_email' ] ) ? '' : $data [ 'comment_author_email' ];
$comment_author_url = ! isset ( $data [ 'comment_author_url' ] ) ? '' : $data [ 'comment_author_url' ];
$comment_author_IP = ! isset ( $data [ 'comment_author_IP' ] ) ? '' : $data [ 'comment_author_IP' ];
$comment_date = ! isset ( $data [ 'comment_date' ] ) ? current_time ( 'mysql' ) : $data [ 'comment_date' ];
$comment_date_gmt = ! isset ( $data [ 'comment_date_gmt' ] ) ? get_gmt_from_date ( $comment_date ) : $data [ 'comment_date_gmt' ];
$comment_post_ID = ! isset ( $data [ 'comment_post_ID' ] ) ? '' : $data [ 'comment_post_ID' ];
$comment_content = ! isset ( $data [ 'comment_content' ] ) ? '' : $data [ 'comment_content' ];
$comment_karma = ! isset ( $data [ 'comment_karma' ] ) ? 0 : $data [ 'comment_karma' ];
$comment_approved = ! isset ( $data [ 'comment_approved' ] ) ? 1 : $data [ 'comment_approved' ];
$comment_agent = ! isset ( $data [ 'comment_agent' ] ) ? '' : $data [ 'comment_agent' ];
$comment_type = ! isset ( $data [ 'comment_type' ] ) ? '' : $data [ 'comment_type' ];
$comment_parent = ! isset ( $data [ 'comment_parent' ] ) ? 0 : $data [ 'comment_parent' ];
2004-12-16 03:57:05 +01:00
2014-05-16 20:52:16 +02:00
$user_id = ! isset ( $data [ 'user_id' ] ) ? 0 : $data [ 'user_id' ];
2006-06-19 19:17:52 +02:00
2014-05-16 20:52:16 +02:00
$compacted = compact ( 'comment_post_ID' , 'comment_author' , 'comment_author_email' , 'comment_author_url' , 'comment_author_IP' , 'comment_date' , 'comment_date_gmt' , 'comment_content' , 'comment_karma' , 'comment_approved' , 'comment_agent' , 'comment_type' , 'comment_parent' , 'user_id' );
2014-06-05 06:38:14 +02:00
if ( ! $wpdb -> insert ( $wpdb -> comments , $compacted ) ) {
2015-01-22 00:18:22 +01:00
$fields = array ( 'comment_author' , 'comment_author_email' , 'comment_author_url' , 'comment_content' );
2015-01-22 00:04:23 +01:00
foreach ( $fields as $field ) {
if ( isset ( $compacted [ $field ] ) ) {
2015-02-26 06:38:24 +01:00
$compacted [ $field ] = $wpdb -> strip_invalid_text_for_column ( $wpdb -> comments , $field , $compacted [ $field ] );
2015-01-22 00:04:23 +01:00
}
}
if ( ! $wpdb -> insert ( $wpdb -> comments , $compacted ) ) {
return false ;
}
2014-06-05 06:38:14 +02:00
}
2014-05-16 20:52:16 +02:00
$id = ( int ) $wpdb -> insert_id ;
if ( $comment_approved == 1 ) {
wp_update_comment_count ( $comment_post_ID );
}
$comment = get_comment ( $id );
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a comment is inserted into the database .
*
* @ since 2.8 . 0
*
* @ param int $id The comment ID .
* @ param obj $comment Comment object .
*/
do_action ( 'wp_insert_comment' , $id , $comment );
2009-01-29 23:22:20 +01:00
2014-02-26 23:05:13 +01:00
wp_cache_set ( 'last_changed' , microtime (), 'comment' );
2012-09-28 14:47:31 +02:00
2006-04-19 04:32:12 +02:00
return $id ;
2004-12-16 03:57:05 +01:00
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Filters and sanitizes comment data .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* Sets the comment data 'filtered' field to true when finished . This can be
* checked as to whether the comment should be filtered and to keep from
* filtering the same comment more than once .
2008-01-04 21:03:42 +01:00
*
* @ since 2.0 . 0
*
2008-09-22 22:21:10 +02:00
* @ param array $commentdata Contains information on the comment .
* @ return array Parsed comment information .
2008-01-04 21:03:42 +01:00
*/
2006-04-19 04:32:12 +02:00
function wp_filter_comment ( $commentdata ) {
2013-12-01 02:12:11 +01:00
if ( isset ( $commentdata [ 'user_ID' ] ) ) {
/**
* Filter the comment author ' s user id before it is set .
*
* The first time this filter is evaluated , 'user_ID' is checked
* ( for back - compat ), followed by the standard 'user_id' value .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param int $user_ID The comment author ' s user ID .
*/
$commentdata [ 'user_id' ] = apply_filters ( 'pre_user_id' , $commentdata [ 'user_ID' ] );
} elseif ( isset ( $commentdata [ 'user_id' ] ) ) {
/** This filter is documented in wp-includes/comment.php */
$commentdata [ 'user_id' ] = apply_filters ( 'pre_user_id' , $commentdata [ 'user_id' ] );
}
/**
* Filter the comment author ' s browser user agent before it is set .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param int $comment_agent The comment author ' s browser user agent .
*/
$commentdata [ 'comment_agent' ] = apply_filters ( 'pre_comment_user_agent' , ( isset ( $commentdata [ 'comment_agent' ] ) ? $commentdata [ 'comment_agent' ] : '' ) );
/** This filter is documented in wp-includes/comment.php */
$commentdata [ 'comment_author' ] = apply_filters ( 'pre_comment_author_name' , $commentdata [ 'comment_author' ] );
/**
* Filter the comment content before it is set .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param int $comment_content The comment content .
*/
$commentdata [ 'comment_content' ] = apply_filters ( 'pre_comment_content' , $commentdata [ 'comment_content' ] );
/**
* Filter the comment author ' s IP before it is set .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param int $comment_author_ip The comment author ' s IP .
*/
$commentdata [ 'comment_author_IP' ] = apply_filters ( 'pre_comment_user_ip' , $commentdata [ 'comment_author_IP' ] );
/** This filter is documented in wp-includes/comment.php */
$commentdata [ 'comment_author_url' ] = apply_filters ( 'pre_comment_author_url' , $commentdata [ 'comment_author_url' ] );
/** This filter is documented in wp-includes/comment.php */
$commentdata [ 'comment_author_email' ] = apply_filters ( 'pre_comment_author_email' , $commentdata [ 'comment_author_email' ] );
2006-04-19 04:32:12 +02:00
$commentdata [ 'filtered' ] = true ;
return $commentdata ;
2004-12-16 03:57:05 +01:00
}
2008-01-04 21:03:42 +01:00
/**
2013-12-01 02:12:11 +01:00
* Whether a comment should be blocked because of comment flood .
2008-01-04 21:03:42 +01:00
*
* @ since 2.1 . 0
*
2008-09-22 05:39:41 +02:00
* @ param bool $block Whether plugin has already blocked comment .
* @ param int $time_lastcomment Timestamp for last comment .
* @ param int $time_newcomment Timestamp for new comment .
* @ return bool Whether comment should be blocked .
2008-01-04 21:03:42 +01:00
*/
2006-10-02 20:19:44 +02:00
function wp_throttle_comment_flood ( $block , $time_lastcomment , $time_newcomment ) {
if ( $block ) // a plugin has already blocked... we'll let that decision stand
return $block ;
if ( ( $time_newcomment - $time_lastcomment ) < 15 )
return true ;
return false ;
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Adds a new comment to the database .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* Filters new comment to ensure that the fields are sanitized and valid before
* inserting comment into database . Calls 'comment_post' action with comment ID
* and whether comment is approved by WordPress . Also has 'preprocess_comment'
* filter for processing the comment data before the function handles it .
2008-01-04 21:03:42 +01:00
*
2010-09-03 12:18:32 +02:00
* We use REMOTE_ADDR here directly . If you are behind a proxy , you should ensure
* that it is properly set , such as in wp - config . php , for your environment .
2014-09-29 15:28:16 +02:00
* See { @ link https :// core . trac . wordpress . org / ticket / 9235 }
2010-09-03 12:18:32 +02:00
*
2008-01-04 21:03:42 +01:00
* @ since 1.5 . 0
2008-09-22 22:21:10 +02:00
* @ param array $commentdata Contains information on the comment .
2014-06-05 06:38:14 +02:00
* @ return int | bool The ID of the comment on success , false on failure .
2008-01-04 21:03:42 +01:00
*/
2006-04-19 04:32:12 +02:00
function wp_new_comment ( $commentdata ) {
2014-06-30 02:41:16 +02:00
if ( isset ( $commentdata [ 'user_ID' ] ) ) {
$commentdata [ 'user_id' ] = $commentdata [ 'user_ID' ] = ( int ) $commentdata [ 'user_ID' ];
}
2014-06-30 13:03:14 +02:00
$prefiltered_user_id = ( isset ( $commentdata [ 'user_id' ] ) ) ? ( int ) $commentdata [ 'user_id' ] : 0 ;
2014-06-30 02:41:16 +02:00
2013-12-01 02:12:11 +01:00
/**
* Filter a comment ' s data before it is sanitized and inserted into the database .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param array $commentdata Comment data .
*/
$commentdata = apply_filters ( 'preprocess_comment' , $commentdata );
2005-01-24 11:13:28 +01:00
2006-04-19 04:32:12 +02:00
$commentdata [ 'comment_post_ID' ] = ( int ) $commentdata [ 'comment_post_ID' ];
2014-06-30 02:41:16 +02:00
if ( isset ( $commentdata [ 'user_ID' ] ) && $prefiltered_user_id !== ( int ) $commentdata [ 'user_ID' ] ) {
2009-11-23 22:04:11 +01:00
$commentdata [ 'user_id' ] = $commentdata [ 'user_ID' ] = ( int ) $commentdata [ 'user_ID' ];
2014-06-30 02:41:16 +02:00
} elseif ( isset ( $commentdata [ 'user_id' ] ) ) {
2009-12-01 03:06:02 +01:00
$commentdata [ 'user_id' ] = ( int ) $commentdata [ 'user_id' ];
2014-06-30 02:41:16 +02:00
}
2005-01-24 11:13:28 +01:00
2009-11-26 12:29:54 +01:00
$commentdata [ 'comment_parent' ] = isset ( $commentdata [ 'comment_parent' ]) ? absint ( $commentdata [ 'comment_parent' ]) : 0 ;
2008-08-24 08:56:22 +02:00
$parent_status = ( 0 < $commentdata [ 'comment_parent' ] ) ? wp_get_comment_status ( $commentdata [ 'comment_parent' ]) : '' ;
$commentdata [ 'comment_parent' ] = ( 'approved' == $parent_status || 'unapproved' == $parent_status ) ? $commentdata [ 'comment_parent' ] : 0 ;
2008-01-26 11:18:33 +01:00
$commentdata [ 'comment_author_IP' ] = preg_replace ( '/[^0-9a-fA-F:., ]/' , '' , $_SERVER [ 'REMOTE_ADDR' ] );
2013-05-16 14:06:36 +02:00
$commentdata [ 'comment_agent' ] = isset ( $_SERVER [ 'HTTP_USER_AGENT' ] ) ? substr ( $_SERVER [ 'HTTP_USER_AGENT' ], 0 , 254 ) : '' ;
2004-12-16 03:57:05 +01:00
2015-03-05 04:00:26 +01:00
if ( empty ( $commentdata [ 'comment_date' ] ) ) {
$commentdata [ 'comment_date' ] = current_time ( 'mysql' );
}
if ( empty ( $commentdata [ 'comment_date_gmt' ] ) ) {
$commentdata [ 'comment_date_gmt' ] = current_time ( 'mysql' , 1 );
}
2004-12-16 03:57:05 +01:00
2006-04-19 04:32:12 +02:00
$commentdata = wp_filter_comment ( $commentdata );
2004-12-16 03:57:05 +01:00
2006-04-19 04:32:12 +02:00
$commentdata [ 'comment_approved' ] = wp_allow_comment ( $commentdata );
2004-12-16 03:57:05 +01:00
2007-03-23 03:05:29 +01:00
$comment_ID = wp_insert_comment ( $commentdata );
2014-06-05 06:38:14 +02:00
if ( ! $comment_ID ) {
return false ;
}
2004-12-16 03:57:05 +01:00
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a comment is inserted into the database .
*
2013-12-01 02:25:10 +01:00
* @ since 1.2 . 0
2013-12-01 02:12:11 +01:00
*
* @ param int $comment_ID The comment ID .
* @ param int $comment_approved 1 ( true ) if the comment is approved , 0 ( false ) if not .
*/
do_action ( 'comment_post' , $comment_ID , $commentdata [ 'comment_approved' ] );
2004-12-16 03:57:05 +01:00
2006-04-19 04:32:12 +02:00
if ( 'spam' !== $commentdata [ 'comment_approved' ] ) { // If it's spam save it silently for later crunching
2013-11-24 17:26:10 +01:00
if ( '0' == $commentdata [ 'comment_approved' ] ) {
wp_notify_moderator ( $comment_ID );
}
2004-12-16 03:57:05 +01:00
2013-11-25 02:47:10 +01:00
// wp_notify_postauthor() checks if notifying the author of their own comment.
// By default, it won't, but filters can override this.
if ( get_option ( 'comments_notify' ) && $commentdata [ 'comment_approved' ] ) {
wp_notify_postauthor ( $comment_ID );
2013-11-24 17:26:10 +01:00
}
2006-04-19 04:32:12 +02:00
}
2004-12-16 03:57:05 +01:00
2006-04-19 04:32:12 +02:00
return $comment_ID ;
2004-12-16 03:57:05 +01:00
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Sets the status of a comment .
2008-01-04 21:03:42 +01:00
*
2012-01-25 11:41:52 +01:00
* The 'wp_set_comment_status' action is called after the comment is handled .
* If the comment status is not in the list , then false is returned .
2008-01-04 21:03:42 +01:00
*
* @ since 1.0 . 0
*
2008-09-22 05:39:41 +02:00
* @ param int $comment_id Comment ID .
2012-01-25 11:41:52 +01:00
* @ param string $comment_status New comment status , either 'hold' , 'approve' , 'spam' , or 'trash' .
2009-03-02 22:48:37 +01:00
* @ param bool $wp_error Whether to return a WP_Error object if there is a failure . Default is false .
2013-06-21 14:45:11 +02:00
* @ return bool | WP_Error True on success , false or WP_Error on failure .
2008-01-04 21:03:42 +01:00
*/
2009-03-02 22:48:37 +01:00
function wp_set_comment_status ( $comment_id , $comment_status , $wp_error = false ) {
2006-12-07 04:57:23 +01:00
global $wpdb ;
2009-09-14 16:03:32 +02:00
2006-12-07 04:57:23 +01:00
switch ( $comment_status ) {
2006-04-19 04:32:12 +02:00
case 'hold' :
2009-11-05 22:03:09 +01:00
case '0' :
2009-03-06 05:27:51 +01:00
$status = '0' ;
2006-12-07 04:57:23 +01:00
break ;
2006-04-19 04:32:12 +02:00
case 'approve' :
2009-11-05 22:03:09 +01:00
case '1' :
2009-03-06 05:27:51 +01:00
$status = '1' ;
2008-05-28 17:37:59 +02:00
if ( get_option ( 'comments_notify' ) ) {
2013-11-25 02:47:10 +01:00
wp_notify_postauthor ( $comment_id );
2008-05-28 17:37:59 +02:00
}
2006-12-07 04:57:23 +01:00
break ;
2006-11-19 08:56:05 +01:00
case 'spam' :
2009-03-06 05:27:51 +01:00
$status = 'spam' ;
2006-12-07 04:57:23 +01:00
break ;
2009-07-30 15:39:34 +02:00
case 'trash' :
$status = 'trash' ;
2006-12-07 04:57:23 +01:00
break ;
2006-04-19 04:32:12 +02:00
default :
return false ;
2006-12-07 04:57:23 +01:00
}
2006-11-19 08:56:05 +01:00
2011-04-06 19:44:29 +02:00
$comment_old = clone get_comment ( $comment_id );
2009-08-21 03:27:01 +02:00
2009-03-06 05:27:51 +01:00
if ( ! $wpdb -> update ( $wpdb -> comments , array ( 'comment_approved' => $status ), array ( 'comment_ID' => $comment_id ) ) ) {
2009-03-02 22:48:37 +01:00
if ( $wp_error )
return new WP_Error ( 'db_update_error' , __ ( 'Could not update comment status' ), $wpdb -> last_error );
else
return false ;
}
2006-12-08 08:35:45 +01:00
2007-06-08 02:20:22 +02:00
clean_comment_cache ( $comment_id );
2006-12-08 08:35:45 +01:00
$comment = get_comment ( $comment_id );
2008-10-16 06:18:45 +02:00
2013-12-01 02:12:11 +01:00
/**
2014-04-25 08:55:14 +02:00
* Fires immediately before transitioning a comment ' s status from one to another
* in the database .
2013-12-01 02:12:11 +01:00
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
2014-04-25 08:55:14 +02:00
* @ param int $comment_id Comment ID .
* @ param string | bool $comment_status Current comment status . Possible values include
* 'hold' , 'approve' , 'spam' , 'trash' , or false .
2013-12-01 02:12:11 +01:00
*/
do_action ( 'wp_set_comment_status' , $comment_id , $comment_status );
2014-04-25 08:55:14 +02:00
2009-08-21 03:27:01 +02:00
wp_transition_comment_status ( $comment_status , $comment_old -> comment_approved , $comment );
2008-10-16 06:18:45 +02:00
2006-12-08 08:35:45 +01:00
wp_update_comment_count ( $comment -> comment_post_ID );
2007-06-08 02:20:22 +02:00
2006-12-08 08:35:45 +01:00
return true ;
2004-12-16 03:57:05 +01:00
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Updates an existing comment in the database .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* Filters the comment and makes sure certain fields are valid before updating .
2008-01-04 21:03:42 +01:00
*
* @ since 2.0 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* @ param array $commentarr Contains information on the comment .
2008-01-04 21:03:42 +01:00
* @ return int Comment was updated if value is 1 , or was not updated if value is 0.
*/
2006-04-19 04:32:12 +02:00
function wp_update_comment ( $commentarr ) {
global $wpdb ;
2004-12-16 03:57:05 +01:00
2006-04-19 04:32:12 +02:00
// First, get all of the original fields
$comment = get_comment ( $commentarr [ 'comment_ID' ], ARRAY_A );
2014-05-15 08:37:15 +02:00
if ( empty ( $comment ) ) {
2013-09-14 20:36:09 +02:00
return 0 ;
2014-05-15 08:37:15 +02:00
}
2015-01-16 03:39:23 +01:00
// Make sure that the comment post ID is valid (if specified).
if ( isset ( $commentarr [ 'comment_post_ID' ] ) && ! get_post ( $commentarr [ 'comment_post_ID' ] ) ) {
return 0 ;
}
2013-03-01 17:28:40 +01:00
// Escape data pulled from DB.
2013-07-16 16:19:03 +02:00
$comment = wp_slash ( $comment );
2013-03-01 17:28:40 +01:00
2009-04-29 19:22:08 +02:00
$old_status = $comment [ 'comment_approved' ];
2006-04-19 04:32:12 +02:00
// Merge old and new fields with new fields overwriting old ones.
$commentarr = array_merge ( $comment , $commentarr );
2004-12-16 04:08:07 +01:00
2006-04-19 04:32:12 +02:00
$commentarr = wp_filter_comment ( $commentarr );
2004-12-16 03:57:05 +01:00
2006-04-19 04:32:12 +02:00
// Now extract the merged array.
2014-05-15 08:37:15 +02:00
$data = wp_unslash ( $commentarr );
2004-12-16 03:57:05 +01:00
2013-12-01 02:12:11 +01:00
/**
* Filter the comment content before it is updated in the database .
*
2013-12-01 02:25:10 +01:00
* @ since 1.5 . 0
2013-12-01 02:12:11 +01:00
*
* @ param string $comment_content The comment data .
*/
2014-05-15 08:37:15 +02:00
$data [ 'comment_content' ] = apply_filters ( 'comment_save_pre' , $data [ 'comment_content' ] );
2004-12-16 03:57:05 +01:00
2014-05-15 08:37:15 +02:00
$data [ 'comment_date_gmt' ] = get_gmt_from_date ( $data [ 'comment_date' ] );
2007-01-09 09:22:28 +01:00
2014-05-15 08:37:15 +02:00
if ( ! isset ( $data [ 'comment_approved' ] ) ) {
$data [ 'comment_approved' ] = 1 ;
2015-01-08 08:05:25 +01:00
} elseif ( 'hold' == $data [ 'comment_approved' ] ) {
2014-05-15 08:37:15 +02:00
$data [ 'comment_approved' ] = 0 ;
2015-01-08 08:05:25 +01:00
} elseif ( 'approve' == $data [ 'comment_approved' ] ) {
2014-05-15 08:37:15 +02:00
$data [ 'comment_approved' ] = 1 ;
}
2008-08-05 00:29:37 +02:00
2014-05-15 08:37:15 +02:00
$comment_ID = $data [ 'comment_ID' ];
$comment_post_ID = $data [ 'comment_post_ID' ];
2015-01-16 03:39:23 +01:00
$keys = array ( 'comment_post_ID' , 'comment_content' , 'comment_author' , 'comment_author_email' , 'comment_approved' , 'comment_karma' , 'comment_author_url' , 'comment_date' , 'comment_date_gmt' , 'comment_type' , 'comment_parent' , 'user_id' );
2014-05-15 08:37:15 +02:00
$data = wp_array_slice_assoc ( $data , $keys );
2010-02-24 01:18:18 +01:00
$rval = $wpdb -> update ( $wpdb -> comments , $data , compact ( 'comment_ID' ) );
2007-06-08 02:20:22 +02:00
2014-05-15 08:37:15 +02:00
clean_comment_cache ( $comment_ID );
wp_update_comment_count ( $comment_post_ID );
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a comment is updated in the database .
*
* The hook also fires immediately before comment status transition hooks are fired .
*
2013-12-01 02:25:10 +01:00
* @ since 1.2 . 0
2013-12-01 02:12:11 +01:00
*
* @ param int $comment_ID The comment ID .
*/
do_action ( 'edit_comment' , $comment_ID );
2008-11-03 07:44:48 +01:00
$comment = get_comment ( $comment_ID );
2009-04-29 19:22:08 +02:00
wp_transition_comment_status ( $comment -> comment_approved , $old_status , $comment );
2006-04-19 04:32:12 +02:00
return $rval ;
2004-12-16 03:57:05 +01:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Whether to defer comment counting .
2008-01-04 21:03:42 +01:00
*
* When setting $defer to true , all post comment counts will not be updated
* until $defer is set to false . When $defer is set to false , then all
* previously deferred updated post comment counts will then be automatically
* updated without having to call wp_update_comment_count () after .
*
2008-09-22 05:39:41 +02:00
* @ since 2.5 . 0
2008-01-04 21:03:42 +01:00
* @ staticvar bool $_defer
*
* @ param bool $defer
2014-11-03 07:17:22 +01:00
* @ return bool
2008-01-04 21:03:42 +01:00
*/
function wp_defer_comment_counting ( $defer = null ) {
2008-01-01 18:03:52 +01:00
static $_defer = false ;
2008-02-05 07:47:27 +01:00
2008-01-01 18:03:52 +01:00
if ( is_bool ( $defer ) ) {
$_defer = $defer ;
// flush any deferred counts
if ( ! $defer )
2008-01-04 21:03:42 +01:00
wp_update_comment_count ( null , true );
2008-01-01 18:03:52 +01:00
}
2008-02-05 07:47:27 +01:00
2008-01-01 18:03:52 +01:00
return $_defer ;
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Updates the comment count for post ( s ) .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* When $do_deferred is false ( is by default ) and the comments have been set to
* be deferred , the post_id will be added to a queue , which will be updated at a
* later date and only updated once per post ID .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* If the comments have not be set up to be deferred , then the post will be
* updated . When $do_deferred is set to true , then all previous deferred post
* IDs will be updated along with the current $post_id .
2008-01-04 21:03:42 +01:00
*
* @ since 2.1 . 0
* @ see wp_update_comment_count_now () For what could cause a false return value
*
* @ param int $post_id Post ID
* @ param bool $do_deferred Whether to process previously deferred post comment counts
2014-12-01 02:34:24 +01:00
* @ return bool | null True on success , false on failure
2008-01-04 21:03:42 +01:00
*/
2008-01-01 18:03:52 +01:00
function wp_update_comment_count ( $post_id , $do_deferred = false ) {
static $_deferred = array ();
2008-02-05 07:47:27 +01:00
2008-01-01 18:03:52 +01:00
if ( $do_deferred ) {
$_deferred = array_unique ( $_deferred );
foreach ( $_deferred as $i => $_post_id ) {
wp_update_comment_count_now ( $_post_id );
2008-01-04 21:03:42 +01:00
unset ( $_deferred [ $i ] ); /** @todo Move this outside of the foreach and reset $_deferred to an array instead */
2008-01-01 18:03:52 +01:00
}
}
2008-02-05 07:47:27 +01:00
2008-01-01 18:03:52 +01:00
if ( wp_defer_comment_counting () ) {
$_deferred [] = $post_id ;
return true ;
}
elseif ( $post_id ) {
return wp_update_comment_count_now ( $post_id );
}
2008-02-05 07:47:27 +01:00
2008-01-01 18:03:52 +01:00
}
2006-12-07 04:57:23 +01:00
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Updates the comment count for the post .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* @ since 2.5 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
* @ param int $post_id Post ID
2013-06-21 14:45:11 +02:00
* @ return bool True on success , false on '0' $post_id or if post with ID does not exist .
2008-01-04 21:03:42 +01:00
*/
2008-01-01 18:03:52 +01:00
function wp_update_comment_count_now ( $post_id ) {
2007-11-29 06:03:25 +01:00
global $wpdb ;
2006-06-19 19:17:52 +02:00
$post_id = ( int ) $post_id ;
if ( ! $post_id )
return false ;
2007-08-14 05:08:44 +02:00
if ( ! $post = get_post ( $post_id ) )
return false ;
$old = ( int ) $post -> comment_count ;
2008-04-14 18:13:25 +02:00
$new = ( int ) $wpdb -> get_var ( $wpdb -> prepare ( " SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1' " , $post_id ) );
2009-03-06 06:06:15 +01:00
$wpdb -> update ( $wpdb -> posts , array ( 'comment_count' => $new ), array ( 'ID' => $post_id ) );
2006-12-08 08:35:45 +01:00
2012-04-24 00:04:35 +02:00
clean_post_cache ( $post );
2006-12-08 08:35:45 +01:00
2013-12-01 02:12:11 +01:00
/**
* Fires immediately after a post ' s comment count is updated in the database .
*
* @ since 2.3 . 0
*
* @ param int $post_id Post ID .
* @ param int $new The new comment count .
* @ param int $old The old comment count .
*/
do_action ( 'wp_update_comment_count' , $post_id , $new , $old );
/** This action is documented in wp-includes/post.php */
do_action ( 'edit_post' , $post_id , $post );
2006-12-08 08:35:45 +01:00
2006-06-19 19:17:52 +02:00
return true ;
}
2006-06-22 21:44:36 +02:00
//
// Ping and trackback functions.
//
2004-12-16 03:57:05 +01:00
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Finds a pingback server URI based on the given URL .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* Checks the HTML for the rel = " pingback " link and x - pingback headers . It does
* a check for the x - pingback headers first and returns that , if available . The
* check for the rel = " pingback " has more overhead than just the header .
2008-01-04 21:03:42 +01:00
*
* @ since 1.5 . 0
*
2008-09-22 05:39:41 +02:00
* @ param string $url URL to ping .
2008-09-27 23:40:09 +02:00
* @ param int $deprecated Not Used .
2014-12-01 02:34:24 +01:00
* @ return false | string False on failure , string containing URI on success .
2008-01-04 21:03:42 +01:00
*/
2009-12-30 17:23:39 +01:00
function discover_pingback_server_uri ( $url , $deprecated = '' ) {
if ( ! empty ( $deprecated ) )
2010-01-09 11:03:55 +01:00
_deprecated_argument ( __FUNCTION__ , '2.7' );
2004-12-16 03:57:05 +01:00
$pingback_str_dquote = 'rel="pingback"' ;
$pingback_str_squote = 'rel=\'pingback\'' ;
2008-09-27 23:40:09 +02:00
/** @todo Should use Filter Extension or custom preg_match instead. */
$parsed_url = parse_url ( $url );
2004-12-16 03:57:05 +01:00
2008-09-27 23:40:09 +02:00
if ( ! isset ( $parsed_url [ 'host' ] ) ) // Not an URL. This should never happen.
2004-12-16 03:57:05 +01:00
return false ;
2009-02-15 21:56:54 +01:00
//Do not search for a pingback server on our own uploads
$uploads_dir = wp_upload_dir ();
if ( 0 === strpos ( $url , $uploads_dir [ 'baseurl' ]) )
return false ;
2013-07-31 08:52:13 +02:00
$response = wp_safe_remote_head ( $url , array ( 'timeout' => 2 , 'httpversion' => '1.0' ) );
2004-12-16 03:57:05 +01:00
2008-09-27 23:40:09 +02:00
if ( is_wp_error ( $response ) )
2004-12-16 03:57:05 +01:00
return false ;
2011-05-14 21:45:07 +02:00
if ( wp_remote_retrieve_header ( $response , 'x-pingback' ) )
return wp_remote_retrieve_header ( $response , 'x-pingback' );
2004-12-16 03:57:05 +01:00
2008-09-27 23:40:09 +02:00
// Not an (x)html, sgml, or xml page, no use going further.
2011-05-14 21:45:07 +02:00
if ( preg_match ( '#(image|audio|video|model)/#is' , wp_remote_retrieve_header ( $response , 'content-type' )) )
2004-12-16 03:57:05 +01:00
return false ;
2012-12-20 16:55:32 +01:00
// Now do a GET since we're going to look in the html headers (and we're sure it's not a binary file)
2013-07-31 08:52:13 +02:00
$response = wp_safe_remote_get ( $url , array ( 'timeout' => 2 , 'httpversion' => '1.0' ) );
2009-02-15 21:56:54 +01:00
if ( is_wp_error ( $response ) )
return false ;
2011-05-14 21:45:07 +02:00
$contents = wp_remote_retrieve_body ( $response );
2008-09-27 23:40:09 +02:00
$pingback_link_offset_dquote = strpos ( $contents , $pingback_str_dquote );
$pingback_link_offset_squote = strpos ( $contents , $pingback_str_squote );
if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) {
$quote = ( $pingback_link_offset_dquote ) ? '"' : '\'' ;
$pingback_link_offset = ( $quote == '"' ) ? $pingback_link_offset_dquote : $pingback_link_offset_squote ;
$pingback_href_pos = @ strpos ( $contents , 'href=' , $pingback_link_offset );
$pingback_href_start = $pingback_href_pos + 6 ;
$pingback_href_end = @ strpos ( $contents , $quote , $pingback_href_start );
$pingback_server_url_len = $pingback_href_end - $pingback_href_start ;
$pingback_server_url = substr ( $contents , $pingback_href_start , $pingback_server_url_len );
// We may find rel="pingback" but an incomplete pingback URL
if ( $pingback_server_url_len > 0 ) { // We got it!
return $pingback_server_url ;
2004-12-16 03:57:05 +01:00
}
}
return false ;
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Perform all pingbacks , enclosures , trackbacks , and send to pingback services .
2008-01-04 21:03:42 +01:00
*
* @ since 2.1 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*/
2006-06-22 21:44:36 +02:00
function do_all_pings () {
global $wpdb ;
// Do pingbacks
2011-10-01 10:38:33 +02:00
while ( $ping = $wpdb -> get_row ( " SELECT ID, post_content, meta_id FROM { $wpdb -> posts } , { $wpdb -> postmeta } WHERE { $wpdb -> posts } .ID = { $wpdb -> postmeta } .post_id AND { $wpdb -> postmeta } .meta_key = '_pingme' LIMIT 1 " )) {
delete_metadata_by_mid ( 'post' , $ping -> meta_id );
pingback ( $ping -> post_content , $ping -> ID );
2006-02-12 08:53:23 +01:00
}
2006-11-19 08:56:05 +01:00
2006-06-22 21:44:36 +02:00
// Do Enclosures
2011-10-01 10:38:33 +02:00
while ( $enclosure = $wpdb -> get_row ( " SELECT ID, post_content, meta_id FROM { $wpdb -> posts } , { $wpdb -> postmeta } WHERE { $wpdb -> posts } .ID = { $wpdb -> postmeta } .post_id AND { $wpdb -> postmeta } .meta_key = '_encloseme' LIMIT 1 " )) {
delete_metadata_by_mid ( 'post' , $enclosure -> meta_id );
do_enclose ( $enclosure -> post_content , $enclosure -> ID );
2006-06-22 21:44:36 +02:00
}
// Do Trackbacks
2008-01-22 06:50:22 +01:00
$trackbacks = $wpdb -> get_col ( " SELECT ID FROM $wpdb->posts WHERE to_ping <> '' AND post_status = 'publish' " );
if ( is_array ( $trackbacks ) )
2006-12-07 04:57:23 +01:00
foreach ( $trackbacks as $trackback )
2008-01-22 06:50:22 +01:00
do_trackbacks ( $trackback );
2009-07-22 01:09:47 +02:00
//Do Update Services/Generic Pings
generic_ping ();
2006-06-22 21:44:36 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Perform trackbacks .
2008-01-04 21:03:42 +01:00
*
* @ since 1.5 . 0
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* @ param int $post_id Post ID to do trackbacks on .
2008-01-04 21:03:42 +01:00
*/
2006-06-22 21:44:36 +02:00
function do_trackbacks ( $post_id ) {
global $wpdb ;
2012-08-23 22:43:47 +02:00
$post = get_post ( $post_id );
2006-06-22 21:44:36 +02:00
$to_ping = get_to_ping ( $post_id );
$pinged = get_pung ( $post_id );
if ( empty ( $to_ping ) ) {
2009-03-18 03:43:45 +01:00
$wpdb -> update ( $wpdb -> posts , array ( 'to_ping' => '' ), array ( 'ID' => $post_id ) );
2006-06-22 21:44:36 +02:00
return ;
}
2013-12-01 02:12:11 +01:00
if ( empty ( $post -> post_excerpt ) ) {
2014-08-12 03:09:17 +02:00
/** This filter is documented in wp-includes/post-template.php */
2013-12-01 02:12:11 +01:00
$excerpt = apply_filters ( 'the_content' , $post -> post_content , $post -> ID );
} else {
2014-08-12 03:09:17 +02:00
/** This filter is documented in wp-includes/post-template.php */
2013-12-01 02:12:11 +01:00
$excerpt = apply_filters ( 'the_excerpt' , $post -> post_excerpt );
}
2006-06-22 21:44:36 +02:00
$excerpt = str_replace ( ']]>' , ']]>' , $excerpt );
2013-05-09 02:22:02 +02:00
$excerpt = wp_html_excerpt ( $excerpt , 252 , '…' );
2006-06-22 21:44:36 +02:00
2013-10-25 00:59:20 +02:00
/** This filter is documented in wp-includes/post-template.php */
2013-12-01 02:12:11 +01:00
$post_title = apply_filters ( 'the_title' , $post -> post_title , $post -> ID );
2006-06-22 21:44:36 +02:00
$post_title = strip_tags ( $post_title );
2006-12-07 04:57:23 +01:00
if ( $to_ping ) {
foreach ( ( array ) $to_ping as $tb_ping ) {
$tb_ping = trim ( $tb_ping );
if ( ! in_array ( $tb_ping , $pinged ) ) {
trackback ( $tb_ping , $post_title , $excerpt , $post_id );
$pinged [] = $tb_ping ;
} else {
2010-11-30 21:04:11 +01:00
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d " , $tb_ping , $post_id ) );
2006-12-07 04:57:23 +01:00
}
2006-06-22 21:44:36 +02:00
}
2006-12-07 04:57:23 +01:00
}
2006-06-22 21:44:36 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Sends pings to all of the ping site services .
2008-01-04 21:03:42 +01:00
*
* @ since 1.2 . 0
*
2014-06-03 06:44:16 +02:00
* @ param int $post_id Post ID .
2008-01-04 21:03:42 +01:00
* @ return int Same as Post ID from parameter
*/
2014-06-03 06:44:16 +02:00
function generic_ping ( $post_id = 0 ) {
2006-08-30 23:46:31 +02:00
$services = get_option ( 'ping_sites' );
2008-02-14 22:50:43 +01:00
$services = explode ( " \n " , $services );
foreach ( ( array ) $services as $service ) {
$service = trim ( $service );
if ( '' != $service )
2006-06-22 21:44:36 +02:00
weblog_ping ( $service );
}
return $post_id ;
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Pings back the links found in a post .
2008-01-04 21:03:42 +01:00
*
* @ since 0.71
* @ uses $wp_version
*
2008-09-22 05:39:41 +02:00
* @ param string $content Post content to check for links .
* @ param int $post_ID Post ID .
2008-01-04 21:03:42 +01:00
*/
2006-06-22 21:44:36 +02:00
function pingback ( $content , $post_ID ) {
2007-12-06 20:49:33 +01:00
global $wp_version ;
2006-12-07 04:57:23 +01:00
include_once ( ABSPATH . WPINC . '/class-IXR.php' );
2010-11-02 09:29:07 +01:00
include_once ( ABSPATH . WPINC . '/class-wp-http-ixr-client.php' );
2010-11-17 19:47:34 +01:00
2006-06-22 21:44:36 +02:00
// original code by Mort (http://mort.mine.nu:8080)
$post_links = array ();
$pung = get_pung ( $post_ID );
2010-12-19 05:58:09 +01:00
2006-06-22 21:44:36 +02:00
// Step 1
// Parsing the post, external links (if any) are stored in the $post_links array
2013-09-10 05:18:08 +02:00
$post_links_temp = wp_extract_urls ( $content );
2006-06-22 21:44:36 +02:00
// Step 2.
// Walking thru the links array
// first we get rid of links pointing to sites, not to specific files
// Example:
// http://dummy-weblog.org
// http://dummy-weblog.org/
// http://dummy-weblog.org/post.php
// We don't wanna ping first and second types, even if they have a valid <link/>
2013-09-10 05:18:08 +02:00
foreach ( ( array ) $post_links_temp as $link_test ) :
2010-12-19 05:58:09 +01:00
if ( ! in_array ( $link_test , $pung ) && ( url_to_postid ( $link_test ) != $post_ID ) // If we haven't pung it already and it isn't a link to itself
2006-06-22 21:44:36 +02:00
&& ! is_local_attachment ( $link_test ) ) : // Also, let's never ping local attachments.
2008-11-10 19:54:18 +01:00
if ( $test = @ parse_url ( $link_test ) ) {
if ( isset ( $test [ 'query' ]) )
$post_links [] = $link_test ;
2010-10-29 09:06:48 +02:00
elseif ( isset ( $test [ 'path' ] ) && ( $test [ 'path' ] != '/' ) && ( $test [ 'path' ] != '' ) )
2008-11-10 19:54:18 +01:00
$post_links [] = $link_test ;
}
2006-06-22 21:44:36 +02:00
endif ;
endforeach ;
2010-12-19 05:58:09 +01:00
2013-03-01 18:39:52 +01:00
$post_links = array_unique ( $post_links );
2013-12-01 02:12:11 +01:00
/**
* Fires just before pinging back links found in a post .
*
* @ since 2.0 . 0
*
* @ param array & $post_links An array of post links to be checked , passed by reference .
* @ param array & $pung Whether a link has already been pinged , passed by reference .
* @ param int $post_ID The post ID .
*/
2012-03-06 23:44:44 +01:00
do_action_ref_array ( 'pre_ping' , array ( & $post_links , & $pung , $post_ID ) );
2006-06-22 21:44:36 +02:00
2006-12-07 04:57:23 +01:00
foreach ( ( array ) $post_links as $pagelinkedto ) {
2010-10-29 09:06:48 +02:00
$pingback_server_url = discover_pingback_server_uri ( $pagelinkedto );
2006-06-22 21:44:36 +02:00
2006-12-07 04:57:23 +01:00
if ( $pingback_server_url ) {
2006-11-19 08:56:05 +01:00
@ set_time_limit ( 60 );
2013-12-01 02:12:11 +01:00
// Now, the RPC call
2006-06-22 21:44:36 +02:00
$pagelinkedfrom = get_permalink ( $post_ID );
// using a timeout of 3 seconds should be enough to cover slow servers
2010-10-29 00:15:54 +02:00
$client = new WP_HTTP_IXR_Client ( $pingback_server_url );
2010-12-19 05:58:09 +01:00
$client -> timeout = 3 ;
2013-12-01 02:12:11 +01:00
/**
* Filter the user agent sent when pinging - back a URL .
*
* @ since 2.9 . 0
*
* @ param string $concat_useragent The user agent concatenated with ' -- WordPress/'
* and the WordPress version .
* @ param string $useragent The useragent .
* @ param string $pingback_server_url The server URL being linked to .
* @ param string $pagelinkedto URL of page linked to .
* @ param string $pagelinkedfrom URL of page linked from .
*/
$client -> useragent = apply_filters ( 'pingback_useragent' , $client -> useragent . ' -- WordPress/' . $wp_version , $client -> useragent , $pingback_server_url , $pagelinkedto , $pagelinkedfrom );
2006-06-22 21:44:36 +02:00
// when set to true, this outputs debug messages by itself
2010-12-19 05:58:09 +01:00
$client -> debug = false ;
2006-06-22 21:44:36 +02:00
2007-06-28 01:28:36 +02:00
if ( $client -> query ( 'pingback.ping' , $pagelinkedfrom , $pagelinkedto ) || ( isset ( $client -> error -> code ) && 48 == $client -> error -> code ) ) // Already registered
2006-06-22 21:44:36 +02:00
add_ping ( $post_ID , $pagelinkedto );
}
}
}
2008-01-04 21:03:42 +01:00
/**
2008-09-22 05:39:41 +02:00
* Check whether blog is public before returning sites .
2008-01-04 21:03:42 +01:00
*
* @ since 2.1 . 0
*
2008-09-22 05:39:41 +02:00
* @ param mixed $sites Will return if blog is public , will not return if not public .
* @ return mixed Empty string if blog is not public , returns $sites , if site is public .
2008-01-04 21:03:42 +01:00
*/
2006-12-07 04:57:23 +01:00
function privacy_ping_filter ( $sites ) {
2006-06-22 21:44:36 +02:00
if ( '0' != get_option ( 'blog_public' ) )
return $sites ;
else
return '' ;
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Send a Trackback .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* Updates database when sending trackback to prevent duplicates .
2008-01-04 21:03:42 +01:00
*
* @ since 0.71
2014-10-31 18:56:22 +01:00
*
* @ global wpdb $wpdb WordPress database abstraction object .
2008-01-04 21:03:42 +01:00
*
2008-06-15 11:34:00 +02:00
* @ param string $trackback_url URL to send trackbacks .
2008-09-22 05:39:41 +02:00
* @ param string $title Title of post .
* @ param string $excerpt Excerpt of post .
* @ param int $ID Post ID .
* @ return mixed Database query from update .
2008-01-04 21:03:42 +01:00
*/
2006-06-22 21:44:36 +02:00
function trackback ( $trackback_url , $title , $excerpt , $ID ) {
2008-09-27 23:40:09 +02:00
global $wpdb ;
2006-06-22 21:44:36 +02:00
if ( empty ( $trackback_url ) )
return ;
2008-09-27 23:40:09 +02:00
$options = array ();
$options [ 'timeout' ] = 4 ;
$options [ 'body' ] = array (
2008-10-23 00:48:14 +02:00
'title' => $title ,
'url' => get_permalink ( $ID ),
'blog_name' => get_option ( 'blogname' ),
'excerpt' => $excerpt
2008-09-27 23:40:09 +02:00
);
2013-07-31 08:52:13 +02:00
$response = wp_safe_remote_post ( $trackback_url , $options );
2008-12-09 19:03:31 +01:00
2008-10-02 02:32:21 +02:00
if ( is_wp_error ( $response ) )
return ;
2008-09-27 23:40:09 +02:00
2010-12-01 02:51:32 +01:00
$wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->posts SET pinged = CONCAT(pinged, ' \n ', %s) WHERE ID = %d " , $trackback_url , $ID ) );
return $wpdb -> query ( $wpdb -> prepare ( " UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d " , $trackback_url , $ID ) );
2006-06-22 21:44:36 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Send a pingback .
2008-01-04 21:03:42 +01:00
*
* @ since 1.2 . 0
* @ uses $wp_version
*
2008-06-15 11:34:00 +02:00
* @ param string $server Host of blog to connect to .
* @ param string $path Path to send the ping .
2008-01-04 21:03:42 +01:00
*/
2006-06-22 21:44:36 +02:00
function weblog_ping ( $server = '' , $path = '' ) {
global $wp_version ;
2006-12-07 04:57:23 +01:00
include_once ( ABSPATH . WPINC . '/class-IXR.php' );
2010-11-02 09:29:07 +01:00
include_once ( ABSPATH . WPINC . '/class-wp-http-ixr-client.php' );
2006-06-22 21:44:36 +02:00
// using a timeout of 3 seconds should be enough to cover slow servers
2010-10-29 00:15:54 +02:00
$client = new WP_HTTP_IXR_Client ( $server , (( ! strlen ( trim ( $path )) || ( '/' == $path )) ? false : $path ));
2006-06-22 21:44:36 +02:00
$client -> timeout = 3 ;
$client -> useragent .= ' -- WordPress/' . $wp_version ;
// when set to true, this outputs debug messages by itself
$client -> debug = false ;
2010-01-04 18:23:29 +01:00
$home = trailingslashit ( home_url () );
2006-08-30 23:46:31 +02:00
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 );
2005-11-18 10:25:47 +01:00
}
2004-12-16 03:57:05 +01:00
2013-01-22 23:30:08 +01:00
/**
* Default filter attached to pingback_ping_source_uri to validate the pingback ' s Source URI
*
* @ since 3.5 . 1
2013-06-21 08:07:47 +02:00
* @ see wp_http_validate_url ()
2013-01-22 23:30:08 +01:00
*
* @ param string $source_uri
* @ return string
*/
function pingback_ping_source_uri ( $source_uri ) {
2013-06-21 08:07:47 +02:00
return ( string ) wp_http_validate_url ( $source_uri );
2013-01-22 23:30:08 +01:00
}
/**
* Default filter attached to xmlrpc_pingback_error .
*
* Returns a generic pingback error code unless the error code is 48 ,
* which reports that the pingback is already registered .
*
* @ since 3.5 . 1
* @ link http :// www . hixie . ch / specs / pingback / pingback #TOC3
*
* @ param IXR_Error $ixr_error
* @ return IXR_Error
*/
function xmlrpc_pingback_error ( $ixr_error ) {
if ( $ixr_error -> code === 48 )
return $ixr_error ;
return new IXR_Error ( 0 , '' );
}
2007-06-08 02:20:22 +02:00
//
// Cache
//
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Removes comment ID from the comment cache .
2008-01-04 21:03:42 +01:00
*
* @ since 2.3 . 0
*
2010-09-07 13:21:11 +02:00
* @ param int | array $ids Comment ID or array of comment IDs to remove from cache
2008-01-04 21:03:42 +01:00
*/
2009-03-10 20:02:27 +01:00
function clean_comment_cache ( $ids ) {
foreach ( ( array ) $ids as $id )
wp_cache_delete ( $id , 'comment' );
2010-08-30 21:59:16 +02:00
2014-02-26 23:05:13 +01:00
wp_cache_set ( 'last_changed' , microtime (), 'comment' );
2007-06-08 02:20:22 +02:00
}
2008-01-04 21:03:42 +01:00
/**
2008-06-15 11:34:00 +02:00
* Updates the comment cache of given comments .
2008-01-04 21:03:42 +01:00
*
2008-09-22 05:39:41 +02:00
* Will add the comments in $comments to the cache . If comment ID already exists
* in the comment cache then it will not be updated . The comment is added to the
* cache using the comment group with the key using the ID of the comments .
2008-01-04 21:03:42 +01:00
*
* @ since 2.3 . 0
*
* @ param array $comments Array of comment row objects
*/
2007-06-08 02:20:22 +02:00
function update_comment_cache ( $comments ) {
2008-01-04 21:03:42 +01:00
foreach ( ( array ) $comments as $comment )
2007-06-08 02:20:22 +02:00
wp_cache_add ( $comment -> comment_ID , $comment , 'comment' );
}
2008-09-15 18:26:37 +02:00
//
// Internal
//
/**
2011-12-14 00:45:31 +01:00
* Close comments on old posts on the fly , without any extra DB queries . Hooked to the_posts .
2008-09-15 18:26:37 +02:00
*
2008-09-22 05:39:41 +02:00
* @ access private
* @ since 2.7 . 0
*
* @ param object $posts Post data object .
2011-09-30 17:35:50 +02:00
* @ param object $query Query object .
2008-09-22 05:39:41 +02:00
* @ return object
2008-09-15 18:26:37 +02:00
*/
2011-09-30 17:35:50 +02:00
function _close_comments_for_old_posts ( $posts , $query ) {
if ( empty ( $posts ) || ! $query -> is_singular () || ! get_option ( 'close_comments_for_old_posts' ) )
2008-09-15 18:26:37 +02:00
return $posts ;
2013-12-01 02:12:11 +01:00
/**
* Filter the list of post types to automatically close comments for .
*
* @ since 3.2 . 0
*
* @ param array $post_types An array of registered post types . Default array with 'post' .
*/
2011-06-01 16:24:02 +02:00
$post_types = apply_filters ( 'close_comments_for_post_types' , array ( 'post' ) );
if ( ! in_array ( $posts [ 0 ] -> post_type , $post_types ) )
return $posts ;
2011-09-30 17:35:50 +02:00
$days_old = ( int ) get_option ( 'close_comments_days_old' );
if ( ! $days_old )
2008-09-15 18:26:37 +02:00
return $posts ;
2012-09-25 07:26:19 +02:00
if ( time () - strtotime ( $posts [ 0 ] -> post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) {
2008-09-15 18:26:37 +02:00
$posts [ 0 ] -> comment_status = 'closed' ;
$posts [ 0 ] -> ping_status = 'closed' ;
}
return $posts ;
}
2008-09-28 05:31:26 +02:00
/**
2011-12-14 00:45:31 +01:00
* Close comments on an old post . Hooked to comments_open and pings_open .
2008-09-28 05:31:26 +02:00
*
* @ access private
* @ since 2.7 . 0
*
* @ param bool $open Comments open or closed
* @ param int $post_id Post ID
* @ return bool $open
*/
function _close_comments_for_old_post ( $open , $post_id ) {
if ( ! $open )
return $open ;
if ( ! get_option ( 'close_comments_for_old_posts' ) )
return $open ;
$days_old = ( int ) get_option ( 'close_comments_days_old' );
if ( ! $days_old )
return $open ;
$post = get_post ( $post_id );
2013-12-01 02:12:11 +01:00
/** This filter is documented in wp-includes/comment.php */
2011-06-01 16:24:02 +02:00
$post_types = apply_filters ( 'close_comments_for_post_types' , array ( 'post' ) );
if ( ! in_array ( $post -> post_type , $post_types ) )
return $open ;
2012-09-25 07:26:19 +02:00
if ( time () - strtotime ( $post -> post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) )
2008-09-28 05:31:26 +02:00
return false ;
return $open ;
}