2019-11-02 10:38:58 +01:00
< ? php
/**
* WordPress Query API
*
* The query API attempts to get which part of WordPress the user is on . It
* also provides functionality for getting URL query information .
*
2019-11-15 22:59:44 +01:00
* @ link https :// developer . wordpress . org / themes / basics / the - loop / More information on The Loop .
2019-11-02 10:38:58 +01:00
*
* @ package WordPress
* @ subpackage Query
*/
/**
2020-12-10 14:06:04 +01:00
* Retrieves the value of a query variable in the WP_Query class .
2019-11-02 10:38:58 +01:00
*
* @ since 1.5 . 0
* @ since 3.9 . 0 The `$default` argument was introduced .
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
* @ param string $var The variable key to retrieve .
* @ param mixed $default Optional . Value to return if the query variable is not set . Default empty .
* @ return mixed Contents of the query variable .
*/
function get_query_var ( $var , $default = '' ) {
global $wp_query ;
return $wp_query -> get ( $var , $default );
}
/**
2020-12-10 14:06:04 +01:00
* Retrieves the currently queried object .
2019-11-02 10:38:58 +01:00
*
* Wrapper for WP_Query :: get_queried_object () .
*
* @ since 3.1 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-12-10 14:06:04 +01:00
* @ return WP_Term | WP_Post_Type | WP_Post | WP_User | null The queried object .
2019-11-02 10:38:58 +01:00
*/
function get_queried_object () {
global $wp_query ;
return $wp_query -> get_queried_object ();
}
/**
2020-12-10 14:06:04 +01:00
* Retrieves the ID of the currently queried object .
2019-11-02 10:38:58 +01:00
*
* Wrapper for WP_Query :: get_queried_object_id () .
*
* @ since 3.1 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
* @ return int ID of the queried object .
*/
function get_queried_object_id () {
global $wp_query ;
return $wp_query -> get_queried_object_id ();
}
/**
2020-12-10 14:06:04 +01:00
* Sets the value of a query variable in the WP_Query class .
2019-11-02 10:38:58 +01:00
*
* @ since 2.2 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
* @ param string $var Query variable key .
* @ param mixed $value Query variable value .
*/
function set_query_var ( $var , $value ) {
global $wp_query ;
$wp_query -> set ( $var , $value );
}
/**
* Sets up The Loop with query parameters .
*
* Note : This function will completely override the main query and isn ' t intended for use
* by plugins or themes . Its overly - simplistic approach to modifying the main query can be
* problematic and should be avoided wherever possible . In most cases , there are better ,
* more performant options for modifying the main query such as via the { @ see 'pre_get_posts' }
* action within WP_Query .
*
* This must not be used within the WordPress Loop .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
* @ param array | string $query Array or string of WP_Query arguments .
2020-05-06 17:23:38 +02:00
* @ return WP_Post [] | int [] Array of post objects or post IDs .
2019-11-02 10:38:58 +01:00
*/
function query_posts ( $query ) {
$GLOBALS [ 'wp_query' ] = new WP_Query ();
return $GLOBALS [ 'wp_query' ] -> query ( $query );
}
/**
* Destroys the previous query and sets up a new query .
*
* This should be used after query_posts () and before another query_posts () .
* This will remove obscure bugs that occur when the previous WP_Query object
* is not destroyed properly before another is set up .
*
* @ since 2.3 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
* @ global WP_Query $wp_the_query Copy of the global WP_Query instance created during wp_reset_query () .
*/
function wp_reset_query () {
$GLOBALS [ 'wp_query' ] = $GLOBALS [ 'wp_the_query' ];
wp_reset_postdata ();
}
/**
* After looping through a separate query , this function restores
* the $post global to the current post in the main query .
*
* @ since 3.0 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*/
function wp_reset_postdata () {
global $wp_query ;
if ( isset ( $wp_query ) ) {
$wp_query -> reset_postdata ();
}
}
/*
* Query type checks .
*/
/**
* Determines whether the query is for an existing archive page .
*
2020-12-10 14:06:04 +01:00
* Archive pages include category , tag , author , date , custom post type ,
* and custom taxonomy based archives .
2019-11-02 10:38:58 +01:00
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2020-12-10 14:06:04 +01:00
* @ see is_category ()
* @ see is_tag ()
* @ see is_author ()
* @ see is_date ()
* @ see is_post_type_archive ()
* @ see is_tax ()
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing archive page .
2019-11-02 10:38:58 +01:00
*/
function is_archive () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_archive ();
}
/**
* Determines whether the query is for an existing post type archive page .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 3.1 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param string | string [] $post_types Optional . Post type or array of posts types
* to check against . Default empty .
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing post type archive page .
2019-11-02 10:38:58 +01:00
*/
function is_post_type_archive ( $post_types = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_post_type_archive ( $post_types );
}
/**
* Determines whether the query is for an existing attachment page .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 2.0 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param int | string | int [] | string [] $attachment Optional . Attachment ID , title , slug , or array of such
* to check against . Default empty .
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing attachment page .
2019-11-02 10:38:58 +01:00
*/
function is_attachment ( $attachment = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_attachment ( $attachment );
}
/**
* Determines whether the query is for an existing author archive page .
*
* If the $author parameter is specified , this function will additionally
* check if the query is for one of the authors specified .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param int | string | int [] | string [] $author Optional . User ID , nickname , nicename , or array of such
* to check against . Default empty .
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing author archive page .
2019-11-02 10:38:58 +01:00
*/
function is_author ( $author = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_author ( $author );
}
/**
* Determines whether the query is for an existing category archive page .
*
* If the $category parameter is specified , this function will additionally
* check if the query is for one of the categories specified .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param int | string | int [] | string [] $category Optional . Category ID , name , slug , or array of such
* to check against . Default empty .
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing category archive page .
2019-11-02 10:38:58 +01:00
*/
function is_category ( $category = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_category ( $category );
}
/**
* Determines whether the query is for an existing tag archive page .
*
* If the $tag parameter is specified , this function will additionally
* check if the query is for one of the tags specified .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 2.3 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param int | string | int [] | string [] $tag Optional . Tag ID , name , slug , or array of such
* to check against . Default empty .
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing tag archive page .
2019-11-02 10:38:58 +01:00
*/
function is_tag ( $tag = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_tag ( $tag );
}
/**
* Determines whether the query is for an existing custom taxonomy archive page .
*
* If the $taxonomy parameter is specified , this function will additionally
* check if the query is for that specific $taxonomy .
*
* If the $term parameter is specified in addition to the $taxonomy parameter ,
* this function will additionally check if the query is for one of the terms
* specified .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 2.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param string | string [] $taxonomy Optional . Taxonomy slug or slugs to check against .
* Default empty .
* @ param int | string | int [] | string [] $term Optional . Term ID , name , slug , or array of such
* to check against . Default empty .
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing custom taxonomy archive page .
* True for custom taxonomy archive pages , false for built - in taxonomies
2020-05-06 17:23:38 +02:00
* ( category and tag archives ) .
2019-11-02 10:38:58 +01:00
*/
function is_tax ( $taxonomy = '' , $term = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_tax ( $taxonomy , $term );
}
/**
* Determines whether the query is for an existing date archive .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing date archive .
2019-11-02 10:38:58 +01:00
*/
function is_date () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_date ();
}
/**
* Determines whether the query is for an existing day archive .
*
* A conditional check to test whether the page is a date - based archive page displaying posts for the current day .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing day archive .
2019-11-02 10:38:58 +01:00
*/
function is_day () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_day ();
}
/**
* Determines whether the query is for a feed .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param string | string [] $feeds Optional . Feed type or array of feed types
* to check against . Default empty .
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for a feed .
2019-11-02 10:38:58 +01:00
*/
function is_feed ( $feeds = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_feed ( $feeds );
}
/**
* Is the query for a comments feed ?
*
* @ since 3.0 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for a comments feed .
2019-11-02 10:38:58 +01:00
*/
function is_comment_feed () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_comment_feed ();
}
/**
* Determines whether the query is for the front page of the site .
*
* This is for what is displayed at your site ' s main URL .
*
* Depends on the site 's "Front page displays" Reading Settings ' show_on_front ' and ' page_on_front ' .
*
* If you set a static page for the front page of your site , this function will return
* true when viewing that page .
*
* Otherwise the same as @ see is_home ()
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 2.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for the front page of the site .
2019-11-02 10:38:58 +01:00
*/
function is_front_page () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_front_page ();
}
/**
* Determines whether the query is for the blog homepage .
*
* The blog homepage is the page that shows the time - based blog content of the site .
*
* is_home () is dependent on the site 's "Front page displays" Reading Settings ' show_on_front '
* and 'page_for_posts' .
*
* If a static page is set for the front page of the site , this function will return true only
* on the page you set as the " Posts page " .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
* @ see is_front_page ()
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for the blog homepage .
2019-11-02 10:38:58 +01:00
*/
function is_home () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_home ();
}
/**
* Determines whether the query is for the Privacy Policy page .
*
* The Privacy Policy page is the page that shows the Privacy Policy content of the site .
*
* is_privacy_policy () is dependent on the site 's "Change your Privacy Policy page" Privacy Settings ' wp_page_for_privacy_policy ' .
*
* This function will return true only on the page you set as the " Privacy Policy page " .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 5.2 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for the Privacy Policy page .
2019-11-02 10:38:58 +01:00
*/
function is_privacy_policy () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_privacy_policy ();
}
/**
* Determines whether the query is for an existing month archive .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing month archive .
2019-11-02 10:38:58 +01:00
*/
function is_month () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_month ();
}
/**
* Determines whether the query is for an existing single page .
*
* If the $page parameter is specified , this function will additionally
* check if the query is for one of the pages specified .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2020-12-10 14:06:04 +01:00
* @ see is_single ()
* @ see is_singular ()
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param int | string | int [] | string [] $page Optional . Page ID , title , slug , or array of such
* to check against . Default empty .
2019-11-02 10:38:58 +01:00
* @ return bool Whether the query is for an existing single page .
*/
function is_page ( $page = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_page ( $page );
}
/**
2020-09-15 14:29:22 +02:00
* Determines whether the query is for a paged result and not for the first page .
2019-11-02 10:38:58 +01:00
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for a paged result .
2019-11-02 10:38:58 +01:00
*/
function is_paged () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_paged ();
}
/**
* Determines whether the query is for a post or page preview .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 2.0 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for a post or page preview .
2019-11-02 10:38:58 +01:00
*/
function is_preview () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_preview ();
}
/**
2020-05-06 17:23:38 +02:00
* Is the query for the robots . txt file ?
2019-11-02 10:38:58 +01:00
*
* @ since 2.1 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for the robots . txt file .
2019-11-02 10:38:58 +01:00
*/
function is_robots () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_robots ();
}
2020-05-06 17:23:38 +02:00
/**
* Is the query for the favicon . ico file ?
*
* @ since 5.4 . 0
*
* @ global WP_Query $wp_query WordPress Query object .
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for the favicon . ico file .
2020-05-06 17:23:38 +02:00
*/
function is_favicon () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_favicon ();
}
2019-11-02 10:38:58 +01:00
/**
* Determines whether the query is for a search .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for a search .
2019-11-02 10:38:58 +01:00
*/
function is_search () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_search ();
}
/**
* Determines whether the query is for an existing single post .
*
* Works for any post type , except attachments and pages
*
* If the $post parameter is specified , this function will additionally
* check if the query is for one of the Posts specified .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2020-12-10 14:06:04 +01:00
* @ see is_page ()
* @ see is_singular ()
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param int | string | int [] | string [] $post Optional . Post ID , title , slug , or array of such
* to check against . Default empty .
2019-11-02 10:38:58 +01:00
* @ return bool Whether the query is for an existing single post .
*/
function is_single ( $post = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_single ( $post );
}
/**
* Determines whether the query is for an existing single post of any post type
* ( post , attachment , page , custom post types ) .
*
* If the $post_types parameter is specified , this function will additionally
* check if the query is for one of the Posts Types specified .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2020-12-10 14:06:04 +01:00
* @ see is_page ()
* @ see is_single ()
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-05-06 17:23:38 +02:00
* @ param string | string [] $post_types Optional . Post type or array of post types
* to check against . Default empty .
* @ return bool Whether the query is for an existing single post
* or any of the given post types .
2019-11-02 10:38:58 +01:00
*/
function is_singular ( $post_types = '' ) {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_singular ( $post_types );
}
/**
* Determines whether the query is for a specific time .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for a specific time .
2019-11-02 10:38:58 +01:00
*/
function is_time () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_time ();
}
/**
* Determines whether the query is for a trackback endpoint call .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for a trackback endpoint call .
2019-11-02 10:38:58 +01:00
*/
function is_trackback () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_trackback ();
}
/**
* Determines whether the query is for an existing year archive .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an existing year archive .
2019-11-02 10:38:58 +01:00
*/
function is_year () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_year ();
}
/**
* Determines whether the query has resulted in a 404 ( returns no results ) .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is a 404 error .
2019-11-02 10:38:58 +01:00
*/
function is_404 () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_404 ();
}
/**
* Is the query for an embedded post ?
*
* @ since 4.4 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is for an embedded post .
2019-11-02 10:38:58 +01:00
*/
function is_embed () {
global $wp_query ;
if ( ! isset ( $wp_query ) ) {
_doing_it_wrong ( __FUNCTION__ , __ ( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
return false ;
}
return $wp_query -> is_embed ();
}
/**
* Determines whether the query is the main query .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 3.3 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool Whether the query is the main query .
2019-11-02 10:38:58 +01:00
*/
function is_main_query () {
2021-07-23 11:58:50 +02:00
global $wp_query ;
2019-11-02 10:38:58 +01:00
if ( 'pre_get_posts' === current_filter () ) {
2021-07-23 11:58:50 +02:00
_doing_it_wrong (
__FUNCTION__ ,
sprintf (
/* translators: 1: pre_get_posts, 2: WP_Query->is_main_query(), 3: is_main_query(), 4: Documentation URL. */
__ ( 'In %1$s, use the %2$s method, not the %3$s function. See %4$s.' ),
'<code>pre_get_posts</code>' ,
'<code>WP_Query->is_main_query()</code>' ,
'<code>is_main_query()</code>' ,
__ ( 'https://developer.wordpress.org/reference/functions/is_main_query/' )
),
'3.7.0'
2019-11-02 10:38:58 +01:00
);
}
return $wp_query -> is_main_query ();
}
/*
* The Loop . Post loop control .
*/
/**
2020-09-15 14:29:22 +02:00
* Determines whether current WordPress query has posts to loop over .
2019-11-02 10:38:58 +01:00
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool True if posts are available , false if end of the loop .
2019-11-02 10:38:58 +01:00
*/
function have_posts () {
global $wp_query ;
return $wp_query -> have_posts ();
}
/**
* Determines whether the caller is in the Loop .
*
* For more information on this and similar theme functions , check out
* the { @ link https :// developer . wordpress . org / themes / basics / conditional - tags /
* Conditional Tags } article in the Theme Developer Handbook .
*
* @ since 2.0 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
* @ return bool True if caller is within loop , false if loop hasn ' t started or ended .
*/
function in_the_loop () {
global $wp_query ;
return $wp_query -> in_the_loop ;
}
/**
* Rewind the loop posts .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*/
function rewind_posts () {
global $wp_query ;
$wp_query -> rewind_posts ();
}
/**
* Iterate the post index in the loop .
*
* @ since 1.5 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*/
function the_post () {
global $wp_query ;
$wp_query -> the_post ();
}
/*
* Comments loop .
*/
/**
2020-09-15 14:29:22 +02:00
* Determines whether current WordPress query has comments to loop over .
2019-11-02 10:38:58 +01:00
*
* @ since 2.2 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-09-15 14:29:22 +02:00
* @ return bool True if comments are available , false if no more comments .
2019-11-02 10:38:58 +01:00
*/
function have_comments () {
global $wp_query ;
return $wp_query -> have_comments ();
}
/**
* Iterate comment index in the comment loop .
*
* @ since 2.2 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
2020-12-10 14:06:04 +01:00
* @ return null
2019-11-02 10:38:58 +01:00
*/
function the_comment () {
global $wp_query ;
return $wp_query -> the_comment ();
}
/**
* Redirect old slugs to the correct permalink .
*
* Attempts to find the current slug from the past slugs .
*
* @ since 2.1 . 0
*/
function wp_old_slug_redirect () {
if ( is_404 () && '' !== get_query_var ( 'name' ) ) {
2020-05-06 17:23:38 +02:00
// Guess the current post type based on the query vars.
2019-11-02 10:38:58 +01:00
if ( get_query_var ( 'post_type' ) ) {
$post_type = get_query_var ( 'post_type' );
} elseif ( get_query_var ( 'attachment' ) ) {
$post_type = 'attachment' ;
} elseif ( get_query_var ( 'pagename' ) ) {
$post_type = 'page' ;
} else {
$post_type = 'post' ;
}
if ( is_array ( $post_type ) ) {
if ( count ( $post_type ) > 1 ) {
return ;
}
$post_type = reset ( $post_type );
}
2020-05-06 17:23:38 +02:00
// Do not attempt redirect for hierarchical post types.
2019-11-02 10:38:58 +01:00
if ( is_post_type_hierarchical ( $post_type ) ) {
return ;
}
$id = _find_post_by_old_slug ( $post_type );
if ( ! $id ) {
$id = _find_post_by_old_date ( $post_type );
}
/**
* Filters the old slug redirect post ID .
*
* @ since 4.9 . 3
*
* @ param int $id The redirect post ID .
*/
$id = apply_filters ( 'old_slug_redirect_post_id' , $id );
if ( ! $id ) {
return ;
}
$link = get_permalink ( $id );
if ( get_query_var ( 'paged' ) > 1 ) {
$link = user_trailingslashit ( trailingslashit ( $link ) . 'page/' . get_query_var ( 'paged' ) );
} elseif ( is_embed () ) {
$link = user_trailingslashit ( trailingslashit ( $link ) . 'embed' );
}
/**
* Filters the old slug redirect URL .
*
* @ since 4.4 . 0
*
* @ param string $link The redirect URL .
*/
$link = apply_filters ( 'old_slug_redirect_url' , $link );
if ( ! $link ) {
return ;
}
2020-05-06 17:23:38 +02:00
wp_redirect ( $link , 301 ); // Permanent redirect.
2019-11-02 10:38:58 +01:00
exit ;
}
}
/**
* Find the post ID for redirecting an old slug .
*
* @ since 4.9 . 3
* @ access private
*
2020-12-10 14:06:04 +01:00
* @ see wp_old_slug_redirect ()
2019-11-02 10:38:58 +01:00
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param string $post_type The current post type based on the query vars .
2020-09-15 14:29:22 +02:00
* @ return int The Post ID .
2019-11-02 10:38:58 +01:00
*/
function _find_post_by_old_slug ( $post_type ) {
global $wpdb ;
$query = $wpdb -> prepare ( " SELECT post_id FROM $wpdb->postmeta , $wpdb->posts WHERE ID = post_id AND post_type = %s AND meta_key = '_wp_old_slug' AND meta_value = %s " , $post_type , get_query_var ( 'name' ) );
2020-05-06 17:23:38 +02:00
// If year, monthnum, or day have been specified, make our query more precise
// just in case there are multiple identical _wp_old_slug values.
2019-11-02 10:38:58 +01:00
if ( get_query_var ( 'year' ) ) {
$query .= $wpdb -> prepare ( ' AND YEAR(post_date) = %d' , get_query_var ( 'year' ) );
}
if ( get_query_var ( 'monthnum' ) ) {
$query .= $wpdb -> prepare ( ' AND MONTH(post_date) = %d' , get_query_var ( 'monthnum' ) );
}
if ( get_query_var ( 'day' ) ) {
$query .= $wpdb -> prepare ( ' AND DAYOFMONTH(post_date) = %d' , get_query_var ( 'day' ) );
}
$id = ( int ) $wpdb -> get_var ( $query );
return $id ;
}
/**
* Find the post ID for redirecting an old date .
*
* @ since 4.9 . 3
* @ access private
*
2020-12-10 14:06:04 +01:00
* @ see wp_old_slug_redirect ()
2019-11-02 10:38:58 +01:00
* @ global wpdb $wpdb WordPress database abstraction object .
*
* @ param string $post_type The current post type based on the query vars .
2020-09-15 14:29:22 +02:00
* @ return int The Post ID .
2019-11-02 10:38:58 +01:00
*/
function _find_post_by_old_date ( $post_type ) {
global $wpdb ;
$date_query = '' ;
if ( get_query_var ( 'year' ) ) {
$date_query .= $wpdb -> prepare ( ' AND YEAR(pm_date.meta_value) = %d' , get_query_var ( 'year' ) );
}
if ( get_query_var ( 'monthnum' ) ) {
$date_query .= $wpdb -> prepare ( ' AND MONTH(pm_date.meta_value) = %d' , get_query_var ( 'monthnum' ) );
}
if ( get_query_var ( 'day' ) ) {
$date_query .= $wpdb -> prepare ( ' AND DAYOFMONTH(pm_date.meta_value) = %d' , get_query_var ( 'day' ) );
}
$id = 0 ;
if ( $date_query ) {
$id = ( int ) $wpdb -> get_var ( $wpdb -> prepare ( " SELECT post_id FROM $wpdb->postmeta AS pm_date, $wpdb->posts WHERE ID = post_id AND post_type = %s AND meta_key = '_wp_old_date' AND post_name = %s " . $date_query , $post_type , get_query_var ( 'name' ) ) );
if ( ! $id ) {
2020-05-06 17:23:38 +02:00
// Check to see if an old slug matches the old date.
2019-11-02 10:38:58 +01:00
$id = ( int ) $wpdb -> get_var ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts , $wpdb->postmeta AS pm_slug, $wpdb->postmeta AS pm_date WHERE ID = pm_slug.post_id AND ID = pm_date.post_id AND post_type = %s AND pm_slug.meta_key = '_wp_old_slug' AND pm_slug.meta_value = %s AND pm_date.meta_key = '_wp_old_date' " . $date_query , $post_type , get_query_var ( 'name' ) ) );
}
}
return $id ;
}
/**
* Set up global post data .
*
* @ since 1.5 . 0
* @ since 4.4 . 0 Added the ability to pass a post ID to `$post` .
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
* @ param WP_Post | object | int $post WP_Post instance or Post ID / object .
* @ return bool True when finished .
*/
function setup_postdata ( $post ) {
global $wp_query ;
if ( ! empty ( $wp_query ) && $wp_query instanceof WP_Query ) {
return $wp_query -> setup_postdata ( $post );
}
return false ;
}
/**
* Generates post data .
*
* @ since 5.2 . 0
*
2019-11-15 22:59:44 +01:00
* @ global WP_Query $wp_query WordPress Query object .
2019-11-02 10:38:58 +01:00
*
* @ param WP_Post | object | int $post WP_Post instance or Post ID / object .
2021-04-27 08:32:47 +02:00
* @ return array | false Elements of post , or false on failure .
2019-11-02 10:38:58 +01:00
*/
function generate_postdata ( $post ) {
global $wp_query ;
if ( ! empty ( $wp_query ) && $wp_query instanceof WP_Query ) {
return $wp_query -> generate_postdata ( $post );
}
return false ;
}