Prevent non-public taxonomies from registering aquery var.

[34247] made the 'public' paramater of `register_taxonomy()` work by blocking
requests for non-public taxonomy archives during `parse_request()`. Blocking
taxonomy archive requests this late means that it's impossible to register an
independent query var that matches the slug of a non-public taxonomy. By
moving the block to `register_taxonomy()` - not allowing these taxonomies to
register their query vars in the first place - we free up the slug for other
use. In addition, we free up a bit of processing (no need to look for the query
var in `parse_request()` and better parallel the way non-public post types
work. See `register_post_type()`.

Non-public taxonomy archives that are requested using `?taxonomy=tax_name` are
still blocked during `parse_request`. It's only custom query vars -
`?tax_name=term` - that are affected by this change.

Props mboynes.
Fixes #21949.

git-svn-id: https://develop.svn.wordpress.org/trunk@35333 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Boone Gorges
2015-10-21 16:53:51 +00:00
parent 8f2e001efe
commit f492a81d70
4 changed files with 41 additions and 8 deletions
+1 -1
View File
@@ -357,7 +357,7 @@ function _cleanup_query_vars() {
unset( $GLOBALS[$v] );
foreach ( get_taxonomies( array() , 'objects' ) as $t ) {
if ( ! empty( $t->query_var ) )
if ( $t->public && ! empty( $t->query_var ) )
$GLOBALS['wp']->add_query_var( $t->query_var );
}
+35
View File
@@ -463,6 +463,41 @@ class Tests_Taxonomy extends WP_UnitTestCase {
$this->assertFalse( is_tax( 'wptests_tax' ) );
}
/**
* @ticket 21949
*/
public function test_it_should_be_possible_to_register_a_query_var_that_matches_the_name_of_a_nonpublic_taxonomy() {
global $wp;
register_taxonomy( 'wptests_tax', 'post', array(
'public' => false,
) );
$t = $this->factory->term->create_and_get( array(
'taxonomy' => 'wptests_tax',
) );
$p = $this->factory->post->create();
wp_set_object_terms( $p, $t->slug, 'wptests_tax' );
add_filter( 'do_parse_request', array( $this, 'register_query_var' ) );
$this->go_to( '/?wptests_tax=foo' );
remove_filter( 'do_parse_request', array( $this, 'register_query_var' ) );
// Not a taxonomy...
$this->assertFalse( is_tax( 'wptests_tax' ) );
// ...but query var works.
$this->assertSame( 'foo', $wp->query_vars['wptests_tax'] );
}
public static function register_query_var( $r ) {
global $wp;
$wp->add_query_var( 'wptests_tax' );
return $r;
}
/**
* @ticket 21949
*/