| 5333 | | * @param string $post_type Post type. |
| 5334 | | * @param bool $full Optional. Returns a full WHERE statement instead of just |
| 5335 | | * an 'andalso' term. Default true. |
| 5336 | | * @param int $post_author Optional. Query posts having a single author ID. Default null. |
| 5337 | | * @param bool $public_only Optional. Only return public posts. Skips cap checks for |
| 5338 | | * $current_user. Default false. |
| | 5333 | * @param array/string $post_types Post type(s). |
| | 5334 | * @param bool $full Optional. Returns a full WHERE statement instead of just |
| | 5335 | * an 'andalso' term. Default true. |
| | 5336 | * @param int $post_author Optional. Query posts having a single author ID. Default null. |
| | 5337 | * @param bool $public_only Optional. Only return public posts. Skips cap checks for |
| | 5338 | * $current_user. Default false. |
| 5358 | | if ( ! $cap = apply_filters( 'pub_priv_sql_capability', '' ) ) { |
| 5359 | | $cap = $post_type_obj->cap->read_private_posts; |
| | 5354 | $cap_hooked = apply_filters( 'pub_priv_sql_capability', '' ); |
| | 5355 | |
| | 5356 | $wheres = array(); |
| | 5357 | foreach ($post_types as $post_type) { |
| | 5358 | $post_type_obj = get_post_type_object( $post_type ); |
| | 5359 | if ( ! $post_type_obj ) |
| | 5360 | return $full ? 'WHERE 1 = 0' : ' 1 = 0 '; |
| | 5361 | |
| | 5362 | $cap = current_user_can( $post_type_obj->cap->read_private_posts ); |
| | 5363 | |
| | 5364 | // Only need to check the cap if $public_only is false. |
| | 5365 | $post_status_sql = "post_status = 'publish'"; |
| | 5366 | if ( false === $public_only ) { |
| | 5367 | if ( !$cap_hooked && $cap ) { |
| | 5368 | // Does the user have the capability to view private posts? Guess so. |
| | 5369 | $post_status_sql .= " OR post_status = 'private'"; |
| | 5370 | } elseif ( is_user_logged_in() ) { |
| | 5371 | // Users can view their own private posts. |
| | 5372 | $id = get_current_user_id(); |
| | 5373 | if ( null === $post_author || ! $full ) { |
| | 5374 | $post_status_sql .= " OR post_status = 'private' AND post_author = $id"; |
| | 5375 | } elseif ( $id == (int) $post_author ) { |
| | 5376 | $post_status_sql .= " OR post_status = 'private'"; |
| | 5377 | } // else none |
| | 5378 | } // else none |
| | 5379 | } |
| | 5380 | $wheres[] = "(post_type = '".$post_type."' AND (".$post_status_sql.'))'; |
| 5368 | | // Only need to check the cap if $public_only is false. |
| 5369 | | $post_status_sql = "post_status = 'publish'"; |
| 5370 | | if ( false === $public_only ) { |
| 5371 | | if ( current_user_can( $cap ) ) { |
| 5372 | | // Does the user have the capability to view private posts? Guess so. |
| 5373 | | $post_status_sql .= " OR post_status = 'private'"; |
| 5374 | | } elseif ( is_user_logged_in() ) { |
| 5375 | | // Users can view their own private posts. |
| 5376 | | $id = get_current_user_id(); |
| 5377 | | if ( null === $post_author || ! $full ) { |
| 5378 | | $post_status_sql .= " OR post_status = 'private' AND post_author = $id"; |
| 5379 | | } elseif ( $id == (int) $post_author ) { |
| 5380 | | $post_status_sql .= " OR post_status = 'private'"; |
| 5381 | | } // else none |
| 5382 | | } // else none |
| 5383 | | } |
| 5384 | | |
| 5385 | | $sql .= " AND ($post_status_sql)"; |
| 5386 | | |