From e688f070dcd2ee0c3ec68d1e8e2cd952ba3f0abe Mon Sep 17 00:00:00 2001 From: Scott Taylor Date: Fri, 6 Sep 2013 23:38:51 +0000 Subject: [PATCH] Check the value passed to `get_post_type_object()`. If it's an array, use the first item. `get_query_var( 'post_type' )` can be an array if the query has been altered via filters/actions. There are several places in core that pass the query var. Adds unit tests. In `template-loader.php`, move `is_post_type_archive()` and `is_tax()` directly below `is_home()`. See #18614, [25291]. git-svn-id: https://develop.svn.wordpress.org/trunk@25292 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 3 ++ src/wp-includes/template-loader.php | 4 +-- tests/phpunit/tests/query/conditionals.php | 33 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index ddd73bc737..e088c2b449 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -1058,6 +1058,9 @@ function get_post_type( $post = null ) { function get_post_type_object( $post_type ) { global $wp_post_types; + if ( is_array( $post_type ) ) + $post_type = reset( $post_type ); + if ( empty($wp_post_types[$post_type]) ) return null; diff --git a/src/wp-includes/template-loader.php b/src/wp-includes/template-loader.php index 81de95618f..9cacb87a01 100644 --- a/src/wp-includes/template-loader.php +++ b/src/wp-includes/template-loader.php @@ -26,10 +26,10 @@ if ( defined('WP_USE_THEMES') && WP_USE_THEMES ) : $template = false; if ( is_404() && $template = get_404_template() ) : elseif ( is_search() && $template = get_search_template() ) : - elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) : - elseif ( is_tax() && $template = get_taxonomy_template() ) : elseif ( is_front_page() && $template = get_front_page_template() ) : elseif ( is_home() && $template = get_home_template() ) : + elseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) : + elseif ( is_tax() && $template = get_taxonomy_template() ) : elseif ( is_attachment() && $template = get_attachment_template() ) : remove_filter('the_content', 'prepend_attachment'); elseif ( is_single() && $template = get_single_template() ) : diff --git a/tests/phpunit/tests/query/conditionals.php b/tests/phpunit/tests/query/conditionals.php index bec0aa6f76..f4b271ba19 100644 --- a/tests/phpunit/tests/query/conditionals.php +++ b/tests/phpunit/tests/query/conditionals.php @@ -683,4 +683,37 @@ class Tests_Query_Conditionals extends WP_UnitTestCase { array( 'taxonomy' => 'post_tag', 'field' => 'term_id', 'terms' => $term->term_id ) ) ); } + + function test_post_type_array() { + delete_option( 'rewrite_rules' ); + + $cpt_name = 'thearray'; + register_post_type( $cpt_name, array( + 'taxonomies' => array( 'post_tag', 'category' ), + 'rewrite' => true, + 'has_archive' => true, + 'public' => true + ) ); + $this->factory->post->create( array( 'post_type' => $cpt_name ) ); + + $this->go_to( "/$cpt_name/" ); + $this->assertQueryTrue( 'is_post_type_archive', 'is_archive' ); + $this->assertEquals( get_queried_object(), get_post_type_object( $cpt_name ) ); + $this->assertEquals( get_queried_object(), get_post_type_object( array( $cpt_name ) ) ); + $this->assertEquals( get_queried_object(), get_post_type_object( array( $cpt_name, 'post' ) ) ); + + add_action( 'pre_get_posts', array( $this, 'pre_get_posts_with_type_array' ) ); + + $this->go_to( "/$cpt_name/" ); + $this->assertQueryTrue( 'is_post_type_archive', 'is_archive' ); + $this->assertEquals( get_queried_object(), get_post_type_object( 'post' ) ); + $this->assertEquals( get_queried_object(), get_post_type_object( array( 'post' ) ) ); + $this->assertEquals( get_queried_object(), get_post_type_object( array( 'post', $cpt_name ) ) ); + + remove_action( 'pre_get_posts', array( $this, 'pre_get_posts_with_type_array' ) ); + } + + function pre_get_posts_with_type_array( &$query ) { + $query->set( 'post_type', array( 'post', 'thearray' ) ); + } }