+ $tag = (array) $tag;
+
+ if ( in_array( (string) $tag_obj->term_id, $tag ) )
+ return true;
+ elseif ( in_array( $tag_obj->name, $tag ) )
+ return true;
+ elseif ( in_array( $tag_obj->slug, $tag ) )
+ return true;
+
+ return false;
+ }
+
+ /**
+ * Is the query for an existing 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.
+ *
+ * @since 3.1.0
+ *
+ * @global array $wp_taxonomies
+ *
+ * @param mixed $taxonomy Optional. Taxonomy slug or slugs.
+ * @param mixed $term Optional. Term ID, name, slug or array of Term IDs, names, and slugs.
+ * @return bool
+ */
+ public function is_tax( $taxonomy = '', $term = '' ) {
+ global $wp_taxonomies;
+
+ if ( !$this->is_tax )
+ return false;
+
+ if ( empty( $taxonomy ) )
+ return true;
+
+ $queried_object = $this->get_queried_object();
+ $tax_array = array_intersect( array_keys( $wp_taxonomies ), (array) $taxonomy );
+ $term_array = (array) $term;
+
+ // Check that the taxonomy matches.
+ if ( ! ( isset( $queried_object->taxonomy ) && count( $tax_array ) && in_array( $queried_object->taxonomy, $tax_array ) ) )
+ return false;
+
+ // Only a Taxonomy provided.
+ if ( empty( $term ) )
+ return true;
+
+ return isset( $queried_object->term_id ) &&
+ count( array_intersect(
+ array( $queried_object->term_id, $queried_object->name, $queried_object->slug ),
+ $term_array
+ ) );
+ }
+
+ /**
+ * Whether the current URL is within the comments popup window.
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_comments_popup() {
+ return (bool) $this->is_comments_popup;
+ }
+
+ /**
+ * Is the query for an existing date archive?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_date() {
+ return (bool) $this->is_date;
+ }
+
+ /**
+ * Is the query for an existing day archive?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_day() {
+ return (bool) $this->is_day;
+ }
+
+ /**
+ * Is the query for a feed?
+ *
+ * @since 3.1.0
+ *
+ * @param string|array $feeds Optional feed types to check.
+ * @return bool
+ */
+ public function is_feed( $feeds = '' ) {
+ if ( empty( $feeds ) || ! $this->is_feed )
+ return (bool) $this->is_feed;
+ $qv = $this->get( 'feed' );
+ if ( 'feed' == $qv )
+ $qv = get_default_feed();
+ return in_array( $qv, (array) $feeds );
+ }
+
+ /**
+ * Is the query for a comments feed?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_comment_feed() {
+ return (bool) $this->is_comment_feed;
+ }
+
+ /**
+ * Is the query 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 WP_Query::is_home()
+ *
+ * @since 3.1.0
+ *
+ * @return bool True, if front of site.
+ */
+ public function is_front_page() {
+ // most likely case
+ if ( 'posts' == get_option( 'show_on_front') && $this->is_home() )
+ return true;
+ elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $this->is_page( get_option( 'page_on_front' ) ) )
+ return true;
+ else
+ return false;
+ }
+
+ /**
+ * Is the query for the blog homepage?
+ *
+ * This is the page which shows the time based blog content of your site.
+ *
+ * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_for_posts'.
+ *
+ * If you set a static page for the front page of your site, this function will return
+ * true only on the page you set as the "Posts page".
+ *
+ * @see WP_Query::is_front_page()
+ *
+ * @since 3.1.0
+ *
+ * @return bool True if blog view homepage.
+ */
+ public function is_home() {
+ return (bool) $this->is_home;
+ }
+
+ /**
+ * Is the query for an existing month archive?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_month() {
+ return (bool) $this->is_month;
+ }
+
+ /**
+ * Is the query 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.
+ *
+ * @see WP_Query::is_single()
+ * @see WP_Query::is_singular()
+ *
+ * @since 3.1.0
+ *
+ * @param mixed $page Page ID, title, slug, path, or array of such.
+ * @return bool
+ */
+ public function is_page( $page = '' ) {
+ if ( !$this->is_page )
+ return false;
+
+ if ( empty( $page ) )
+ return true;
+
+ $page_obj = $this->get_queried_object();
+
+ $page = (array) $page;
+
+ if ( in_array( (string) $page_obj->ID, $page ) ) {
+ return true;
+ } elseif ( in_array( $page_obj->post_title, $page ) ) {
+ return true;
+ } elseif ( in_array( $page_obj->post_name, $page ) ) {
+ return true;
+ } else {
+ foreach ( $page as $pagepath ) {
+ if ( ! strpos( $pagepath, '/' ) ) {
+ continue;
+ }
+ $pagepath_obj = get_page_by_path( $pagepath );
+
+ if ( $pagepath_obj && ( $pagepath_obj->ID == $page_obj->ID ) ) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Is the query for paged result and not for the first page?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_paged() {
+ return (bool) $this->is_paged;
+ }
+
+ /**
+ * Is the query for a post or page preview?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_preview() {
+ return (bool) $this->is_preview;
+ }
+
+ /**
+ * Is the query for the robots file?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_robots() {
+ return (bool) $this->is_robots;
+ }
+
+ /**
+ * Is the query for a search?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_search() {
+ return (bool) $this->is_search;
+ }
+
+ /**
+ * Is the query 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.
+ *
+ * @see WP_Query::is_page()
+ * @see WP_Query::is_singular()
+ *
+ * @since 3.1.0
+ *
+ * @param mixed $post Post ID, title, slug, path, or array of such.
+ * @return bool
+ */
+ public function is_single( $post = '' ) {
+ if ( !$this->is_single )
+ return false;
+
+ if ( empty($post) )
+ return true;
+
+ $post_obj = $this->get_queried_object();
+
+ $post = (array) $post;
+
+ if ( in_array( (string) $post_obj->ID, $post ) ) {
+ return true;
+ } elseif ( in_array( $post_obj->post_title, $post ) ) {
+ return true;
+ } elseif ( in_array( $post_obj->post_name, $post ) ) {
+ return true;
+ } else {
+ foreach ( $post as $postpath ) {
+ if ( ! strpos( $postpath, '/' ) ) {
+ continue;
+ }
+ $postpath_obj = get_page_by_path( $postpath, OBJECT, $post_obj->post_type );
+
+ if ( $postpath_obj && ( $postpath_obj->ID == $post_obj->ID ) ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Is the query for an existing single post of any post type (post, attachment, page, ... )?
+ *
+ * If the $post_types parameter is specified, this function will additionally
+ * check if the query is for one of the Posts Types specified.
+ *
+ * @see WP_Query::is_page()
+ * @see WP_Query::is_single()
+ *
+ * @since 3.1.0
+ *
+ * @param mixed $post_types Optional. Post Type or array of Post Types
+ * @return bool
+ */
+ public function is_singular( $post_types = '' ) {
+ if ( empty( $post_types ) || !$this->is_singular )
+ return (bool) $this->is_singular;
+
+ $post_obj = $this->get_queried_object();
+
+ return in_array( $post_obj->post_type, (array) $post_types );
+ }
+
+ /**
+ * Is the query for a specific time?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_time() {
+ return (bool) $this->is_time;
+ }
+
+ /**
+ * Is the query for a trackback endpoint call?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_trackback() {
+ return (bool) $this->is_trackback;
+ }
+
+ /**
+ * Is the query for an existing year archive?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_year() {
+ return (bool) $this->is_year;
+ }
+
+ /**
+ * Is the query a 404 (returns no results)?
+ *
+ * @since 3.1.0
+ *
+ * @return bool
+ */
+ public function is_404() {
+ return (bool) $this->is_404;
+ }
+
+ /**
+ * Is the query the main query?
+ *
+ * @since 3.3.0
+ *
+ * @global WP_Query $wp_query
+ *
+ * @return bool
+ */
+ public function is_main_query() {
+ global $wp_the_query;
+ return $wp_the_query === $this;
+ }
+
+ /**
+ * Set up global post data.
+ *
+ * @since 4.1.0
+ *
+ * @global int $id
+ * @global WP_User $authordata
+ * @global string|int|bool $currentday
+ * @global string|int|bool $currentmonth
+ * @global int $page
+ * @global array $pages
+ * @global int $multipage
+ * @global int $more
+ * @global int $numpages
+ *
+ * @param WP_Post $post Post data.
+ * @return true True when finished.
+ */
+ public function setup_postdata( $post ) {
+ global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages;
+
+ $id = (int) $post->ID;
+
+ $authordata = get_userdata($post->post_author);
+
+ $currentday = mysql2date('d.m.y', $post->post_date, false);
+ $currentmonth = mysql2date('m', $post->post_date, false);
+ $numpages = 1;
+ $multipage = 0;
+ $page = $this->get( 'page' );
+ if ( ! $page )
+ $page = 1;
+
+ /*
+ * Force full post content when viewing the permalink for the $post,
+ * or when on an RSS feed. Otherwise respect the 'more' tag.
+ */
+ if ( $post->ID === get_queried_object_id() && ( $this->is_page() || $this->is_single() ) ) {
+ $more = 1;
+ } elseif ( $this->is_feed() ) {
+ $more = 1;
+ } else {
+ $more = 0;
+ }
+
+ $content = $post->post_content;
+ if ( false !== strpos( $content, '<!--nextpage-->' ) ) {
+ if ( $page > 1 )
+ $more = 1;
+ $content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content );
+ $content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content );
+ $content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content );
+
+ // Ignore nextpage at the beginning of the content.
+ if ( 0 === strpos( $content, '<!--nextpage-->' ) )
+ $content = substr( $content, 15 );
+
+ $pages = explode('<!--nextpage-->', $content);
+ $numpages = count($pages);
+ if ( $numpages > 1 )
+ $multipage = 1;
+ } else {
+ $pages = array( $post->post_content );
+ }
+
+ /**
+ * Fires once the post data has been setup.
+ *
+ * @since 2.8.0
+ * @since 4.1.0 Introduced `$this` parameter.
+ *
+ * @param WP_Post &$post The Post object (passed by reference).
+ * @param WP_Query &$this The current Query object (passed by reference).
+ */
+ do_action_ref_array( 'the_post', array( &$post, &$this ) );
+
+ return true;
+ }
+ /**
+ * After looping through a nested query, this function
+ * restores the $post global to the current post in this query.
+ *
+ * @since 3.7.0
+ *
+ * @global WP_Post $post
+ */
+ public function reset_postdata() {
+ if ( ! empty( $this->post ) ) {
+ $GLOBALS['post'] = $this->post;
+ setup_postdata( $this->post );
+ }
+ }
+}
+
+/**
+ * Redirect old slugs to the correct permalink.
+ *
+ * Attempts to find the current slug from the past slugs.
+ *
+ * @since 2.1.0
+ *
+ * @global WP_Query $wp_query
+ * @global wpdb $wpdb WordPress database abstraction object.
+ */
+function wp_old_slug_redirect() {