wp/wp-includes/class-wp-comment.php
changeset 7 cf61fcea0001
child 9 177826044cd9
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 <?php
       
     2 /**
       
     3  * Comment API: WP_Comment class
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Comments
       
     7  * @since 4.4.0
       
     8  */
       
     9 
       
    10 /**
       
    11  * Core class used to organize comments as instantiated objects with defined members.
       
    12  *
       
    13  * @since 4.4.0
       
    14  */
       
    15 final class WP_Comment {
       
    16 
       
    17 	/**
       
    18 	 * Comment ID.
       
    19 	 *
       
    20 	 * @since 4.4.0
       
    21 	 * @var int
       
    22 	 */
       
    23 	public $comment_ID;
       
    24 
       
    25 	/**
       
    26 	 * ID of the post the comment is associated with.
       
    27 	 *
       
    28 	 * @since 4.4.0
       
    29 	 * @var int
       
    30 	 */
       
    31 	public $comment_post_ID = 0;
       
    32 
       
    33 	/**
       
    34 	 * Comment author name.
       
    35 	 *
       
    36 	 * @since 4.4.0
       
    37 	 * @var string
       
    38 	 */
       
    39 	public $comment_author = '';
       
    40 
       
    41 	/**
       
    42 	 * Comment author email address.
       
    43 	 *
       
    44 	 * @since 4.4.0
       
    45 	 * @var string
       
    46 	 */
       
    47 	public $comment_author_email = '';
       
    48 
       
    49 	/**
       
    50 	 * Comment author URL.
       
    51 	 *
       
    52 	 * @since 4.4.0
       
    53 	 * @var string
       
    54 	 */
       
    55 	public $comment_author_url = '';
       
    56 
       
    57 	/**
       
    58 	 * Comment author IP address (IPv4 format).
       
    59 	 *
       
    60 	 * @since 4.4.0
       
    61 	 * @var string
       
    62 	 */
       
    63 	public $comment_author_IP = '';
       
    64 
       
    65 	/**
       
    66 	 * Comment date in YYYY-MM-DD HH:MM:SS format.
       
    67 	 *
       
    68 	 * @since 4.4.0
       
    69 	 * @var string
       
    70 	 */
       
    71 	public $comment_date = '0000-00-00 00:00:00';
       
    72 
       
    73 	/**
       
    74 	 * Comment GMT date in YYYY-MM-DD HH::MM:SS format.
       
    75 	 *
       
    76 	 * @since 4.4.0
       
    77 	 * @var string
       
    78 	 */
       
    79 	public $comment_date_gmt = '0000-00-00 00:00:00';
       
    80 
       
    81 	/**
       
    82 	 * Comment content.
       
    83 	 *
       
    84 	 * @since 4.4.0
       
    85 	 * @var string
       
    86 	 */
       
    87 	public $comment_content;
       
    88 
       
    89 	/**
       
    90 	 * Comment karma count.
       
    91 	 *
       
    92 	 * @since 4.4.0
       
    93 	 * @var int
       
    94 	 */
       
    95 	public $comment_karma = 0;
       
    96 
       
    97 	/**
       
    98 	 * Comment approval status.
       
    99 	 *
       
   100 	 * @since 4.4.0
       
   101 	 * @var string
       
   102 	 */
       
   103 	public $comment_approved = '1';
       
   104 
       
   105 	/**
       
   106 	 * Comment author HTTP user agent.
       
   107 	 *
       
   108 	 * @since 4.4.0
       
   109 	 * @var string
       
   110 	 */
       
   111 	public $comment_agent = '';
       
   112 
       
   113 	/**
       
   114 	 * Comment type.
       
   115 	 *
       
   116 	 * @since 4.4.0
       
   117 	 * @var string
       
   118 	 */
       
   119 	public $comment_type = '';
       
   120 
       
   121 	/**
       
   122 	 * Parent comment ID.
       
   123 	 *
       
   124 	 * @since 4.4.0
       
   125 	 * @var int
       
   126 	 */
       
   127 	public $comment_parent = 0;
       
   128 
       
   129 	/**
       
   130 	 * Comment author ID.
       
   131 	 *
       
   132 	 * @since 4.4.0
       
   133 	 * @var int
       
   134 	 */
       
   135 	public $user_id = 0;
       
   136 
       
   137 	/**
       
   138 	 * Comment children.
       
   139 	 *
       
   140 	 * @since 4.4.0
       
   141 	 * @var array
       
   142 	 */
       
   143 	protected $children;
       
   144 
       
   145 	/**
       
   146 	 * Whether children have been populated for this comment object.
       
   147 	 *
       
   148 	 * @since 4.4.0
       
   149 	 * @var bool
       
   150 	 */
       
   151 	protected $populated_children = false;
       
   152 
       
   153 	/**
       
   154 	 * Post fields.
       
   155 	 *
       
   156 	 * @since 4.4.0
       
   157 	 * @var array
       
   158 	 */
       
   159 	protected $post_fields = array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_content_filtered', 'post_parent', 'guid', 'menu_order', 'post_type', 'post_mime_type', 'comment_count' );
       
   160 
       
   161 	/**
       
   162 	 * Retrieves a WP_Comment instance.
       
   163 	 *
       
   164 	 * @since 4.4.0
       
   165 	 * @static
       
   166 	 *
       
   167 	 * @global wpdb $wpdb WordPress database abstraction object.
       
   168 	 *
       
   169 	 * @param int $id Comment ID.
       
   170 	 * @return WP_Comment|false Comment object, otherwise false.
       
   171 	 */
       
   172 	public static function get_instance( $id ) {
       
   173 		global $wpdb;
       
   174 
       
   175 		$comment_id = (int) $id;
       
   176 		if ( ! $comment_id ) {
       
   177 			return false;
       
   178 		}
       
   179 
       
   180 		$_comment = wp_cache_get( $comment_id, 'comment' );
       
   181 
       
   182 		if ( ! $_comment ) {
       
   183 			$_comment = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id ) );
       
   184 
       
   185 			if ( ! $_comment ) {
       
   186 				return false;
       
   187 			}
       
   188 
       
   189 			wp_cache_add( $_comment->comment_ID, $_comment, 'comment' );
       
   190 		}
       
   191 
       
   192 		return new WP_Comment( $_comment );
       
   193 	}
       
   194 
       
   195 	/**
       
   196 	 * Constructor.
       
   197 	 *
       
   198 	 * Populates properties with object vars.
       
   199 	 *
       
   200 	 * @since 4.4.0
       
   201 	 *
       
   202 	 * @param WP_Comment $comment Comment object.
       
   203 	 */
       
   204 	public function __construct( $comment ) {
       
   205 		foreach ( get_object_vars( $comment ) as $key => $value ) {
       
   206 			$this->$key = $value;
       
   207 		}
       
   208 	}
       
   209 
       
   210 	/**
       
   211 	 * Convert object to array.
       
   212 	 *
       
   213 	 * @since 4.4.0
       
   214 	 *
       
   215 	 * @return array Object as array.
       
   216 	 */
       
   217 	public function to_array() {
       
   218 		return get_object_vars( $this );
       
   219 	}
       
   220 
       
   221 	/**
       
   222 	 * Get the children of a comment.
       
   223 	 *
       
   224 	 * @since 4.4.0
       
   225 	 *
       
   226 	 * @param array $args {
       
   227 	 *     Array of arguments used to pass to get_comments() and determine format.
       
   228 	 *
       
   229 	 *     @type string $format        Return value format. 'tree' for a hierarchical tree, 'flat' for a flattened array.
       
   230 	 *                                 Default 'tree'.
       
   231 	 *     @type string $status        Comment status to limit results by. Accepts 'hold' (`comment_status=0`),
       
   232 	 *                                 'approve' (`comment_status=1`), 'all', or a custom comment status.
       
   233 	 *                                 Default 'all'.
       
   234 	 *     @type string $hierarchical  Whether to include comment descendants in the results.
       
   235 	 *                                 'threaded' returns a tree, with each comment's children
       
   236 	 *                                 stored in a `children` property on the `WP_Comment` object.
       
   237 	 *                                 'flat' returns a flat array of found comments plus their children.
       
   238 	 *                                 Pass `false` to leave out descendants.
       
   239 	 *                                 The parameter is ignored (forced to `false`) when `$fields` is 'ids' or 'counts'.
       
   240 	 *                                 Accepts 'threaded', 'flat', or false. Default: 'threaded'.
       
   241 	 *     @type string|array $orderby Comment status or array of statuses. To use 'meta_value'
       
   242 	 *                                 or 'meta_value_num', `$meta_key` must also be defined.
       
   243 	 *                                 To sort by a specific `$meta_query` clause, use that
       
   244 	 *                                 clause's array key. Accepts 'comment_agent',
       
   245 	 *                                 'comment_approved', 'comment_author',
       
   246 	 *                                 'comment_author_email', 'comment_author_IP',
       
   247 	 *                                 'comment_author_url', 'comment_content', 'comment_date',
       
   248 	 *                                 'comment_date_gmt', 'comment_ID', 'comment_karma',
       
   249 	 *                                 'comment_parent', 'comment_post_ID', 'comment_type',
       
   250 	 *                                 'user_id', 'comment__in', 'meta_value', 'meta_value_num',
       
   251 	 *                                 the value of $meta_key, and the array keys of
       
   252 	 *                                 `$meta_query`. Also accepts false, an empty array, or
       
   253 	 *                                 'none' to disable `ORDER BY` clause.
       
   254 	 * }
       
   255 	 * @return array Array of `WP_Comment` objects.
       
   256 	 */
       
   257 	public function get_children( $args = array() ) {
       
   258 		$defaults = array(
       
   259 			'format' => 'tree',
       
   260 			'status' => 'all',
       
   261 			'hierarchical' => 'threaded',
       
   262 			'orderby' => '',
       
   263 		);
       
   264 
       
   265 		$_args = wp_parse_args( $args, $defaults );
       
   266 		$_args['parent'] = $this->comment_ID;
       
   267 
       
   268 		if ( is_null( $this->children ) ) {
       
   269 			if ( $this->populated_children ) {
       
   270 				$this->children = array();
       
   271 			} else {
       
   272 				$this->children = get_comments( $_args );
       
   273 			}
       
   274 		}
       
   275 
       
   276 		if ( 'flat' === $_args['format'] ) {
       
   277 			$children = array();
       
   278 			foreach ( $this->children as $child ) {
       
   279 				$child_args = $_args;
       
   280 				$child_args['format'] = 'flat';
       
   281 				// get_children() resets this value automatically.
       
   282 				unset( $child_args['parent'] );
       
   283 
       
   284 				$children = array_merge( $children, array( $child ), $child->get_children( $child_args ) );
       
   285 			}
       
   286 		} else {
       
   287 			$children = $this->children;
       
   288 		}
       
   289 
       
   290 		return $children;
       
   291 	}
       
   292 
       
   293 	/**
       
   294 	 * Add a child to the comment.
       
   295 	 *
       
   296 	 * Used by `WP_Comment_Query` when bulk-filling descendants.
       
   297 	 *
       
   298 	 * @since 4.4.0
       
   299 	 *
       
   300 	 * @param WP_Comment $child Child comment.
       
   301 	 */
       
   302 	public function add_child( WP_Comment $child ) {
       
   303 		$this->children[ $child->comment_ID ] = $child;
       
   304 	}
       
   305 
       
   306 	/**
       
   307 	 * Get a child comment by ID.
       
   308 	 *
       
   309 	 * @since 4.4.0
       
   310 	 *
       
   311 	 * @param int $child_id ID of the child.
       
   312 	 * @return WP_Comment|bool Returns the comment object if found, otherwise false.
       
   313 	 */
       
   314 	public function get_child( $child_id ) {
       
   315 		if ( isset( $this->children[ $child_id ] ) ) {
       
   316 			return $this->children[ $child_id ];
       
   317 		}
       
   318 
       
   319 		return false;
       
   320 	}
       
   321 
       
   322 	/**
       
   323 	 * Set the 'populated_children' flag.
       
   324 	 *
       
   325 	 * This flag is important for ensuring that calling `get_children()` on a childless comment will not trigger
       
   326 	 * unneeded database queries.
       
   327 	 *
       
   328 	 * @since 4.4.0
       
   329 	 *
       
   330 	 * @param bool $set Whether the comment's children have already been populated.
       
   331 	 */
       
   332 	public function populated_children( $set ) {
       
   333 		$this->populated_children = (bool) $set;
       
   334 	}
       
   335 
       
   336 	/**
       
   337 	 * Check whether a non-public property is set.
       
   338 	 *
       
   339 	 * If `$name` matches a post field, the comment post will be loaded and the post's value checked.
       
   340 	 *
       
   341 	 * @since 4.4.0
       
   342 	 *
       
   343 	 * @param string $name Property name.
       
   344 	 * @return bool
       
   345 	 */
       
   346 	public function __isset( $name ) {
       
   347 		if ( in_array( $name, $this->post_fields ) && 0 !== (int) $this->comment_post_ID ) {
       
   348 			$post = get_post( $this->comment_post_ID );
       
   349 			return property_exists( $post, $name );
       
   350 		}
       
   351 	}
       
   352 
       
   353 	/**
       
   354 	 * Magic getter.
       
   355 	 *
       
   356 	 * If `$name` matches a post field, the comment post will be loaded and the post's value returned.
       
   357 	 *
       
   358 	 * @since 4.4.0
       
   359 	 *
       
   360 	 * @param string $name
       
   361 	 * @return mixed
       
   362 	 */
       
   363 	public function __get( $name ) {
       
   364 		if ( in_array( $name, $this->post_fields ) ) {
       
   365 			$post = get_post( $this->comment_post_ID );
       
   366 			return $post->$name;
       
   367 		}
       
   368 	}
       
   369 }