WordPress.org

Ready to get started?Download WordPress

Forums

tax_query not working, anything change in latest version? (3 posts)

  1. Maxaud
    Member
    Posted 1 year ago #

    I'm using the following code to do a tax_query and it doesn't seem to work anymore..

    At some point it was working and for the life of me it wont, anymore.

    <?php
    
    	global $pf_override;
    
    	class PF_override {
    
    		public $site_terms = array();
    
    		function __construct() {
    
    			// add filters
    			add_filter( 'init', array( &$this, 'populates_site_terms' ) );
    			add_filter( 'pre_get_posts', array( &$this, 'filter_query' ) );
    		}
    
    		function populates_site_terms() {
    
    			// my actual function does some processing and
    			// checks caches and combines IDs from multiple
    			// different sources here and then sets site_terms 
    
    			$this->site_terms = array( 1, 2, 3 );
    		}
    
    		function filter_query( $query ) {
    
    			// not the main query?
    			if ( !$query->is_main_query() ) {
    				return $query;
    			}
    
    			// have terms to filter by?
    			if ( !empty( $this->site_terms ) ) {
    
    				// construct tax_query
    				$tax_query = array(
    					'taxonomy' 	=> 'site_category',
    					'field' 	=> 'id',
    					'terms' 	=> $this->site_terms,
    					'operator' 	=> 'IN'
    					);
    
    				// this needs to be an array of arrays
    				$taxquery = array(
    					$tax_query
    				);
    
    				// set this..
    				$query->set( 'tax_query', $taxquery );
    			}
    
    			// return new query object
    			return $query;
    		}
    	}
    
    	// not the admin? init class
    	if ( !is_admin() ) {
    		$pf_override = new PF_override();
    	}
    
    ?>

    Taxonomy is added like so:

    function PF_register_post_type() {
    		$labels = array(
    			'name'              => _x( 'Site Category', 'taxonomy general name' ),
    			'singular_name'     => _x( 'Site Category', 'taxonomy singular name' ),
    			'search_items'      => __( 'Search Site Categories' ),
    			'all_items'         => __( 'All Site Categories' ),
    			'parent_item'       => __( 'Parent Site Category' ),
    			'parent_item_colon' => __( 'Parent Site Category:' ),
    			'edit_item'         => __( 'Edit Site Category' ),
    			'update_item'       => __( 'Update Site Category' ),
    			'add_new_item'      => __( 'Add New Site Category' ),
    			'new_item_name'     => __( 'New Site Category Name' ),
    			'menu_name'         => __( 'Site Category' ),
    		);
    
    		$args = array(
    			'hierarchical'      => true,
    			'labels'            => $labels,
    			'show_ui'           => true,
    			'show_admin_column' => true,
    			'query_var'         => true,
    			'rewrite'           => array( 'slug' => 'sitecat' ),
    		);
    
    		register_taxonomy( 'site_category', array( 'post', 'page', 'attachment', 'revision', 'nav_menu_item' ), $args );
    }
    
    add_action( 'init', 'PF_register_post_types', 1 );

    In my footer.php I add this code:

    $GLOBALS['wp_query']->request

    I get this as a result when going to mydomain.com/testing:

    SELECT wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.post_name = 'testing' AND wp_posts.post_type = 'post' ORDER BY wp_posts.post_date DESC

    The $pf_override variable shows $pf_override->site_terms to be set as an array of

    array( [0] => 1, [1] => 2, [2] => 3 )
  2. Maxaud
    Member
    Posted 1 year ago #

    Well it seems after digging in to the code, tax_query is being blocked on single post/page pages which is why I'm running in to this issue.

    If you see the ability to run tax_query in all circumstances as beneficial, please voice your opinion on trac.

    See ticket here:
    http://core.trac.wordpress.org/ticket/24819

  3. Maxaud
    Member
    Posted 1 year ago #

    I managed to filter the code by adding some where and join clauses.

    New code:

    <?php
    
    	global $pf_override;
    
    	class PF_override {
    
    		public $site_terms = array();
    
    		public $sql_join 	= '';
    		public $sql_where 	= '';
    
    		function __construct() {
    
    			// add filters
    			add_filter( 'init', array( &$this, 'populates_site_terms' ) );
    			add_filter( 'pre_get_posts', array( &$this, 'filter_query' ) );
    		}
    
    		function populates_site_terms() {
    
    			// my actual function does some processing and
    			// checks caches and combines IDs from multiple
    			// different sources here and then sets site_terms 
    
    			$this->site_terms = array( 1, 2, 3 );
    		}
    
    		function filter_query( $query ) {
    
    			// not the main query?
    			if ( !$query->is_main_query() ) {
    				return $query;
    			}
    
    			// have terms to filter by?
    			if ( !empty( $this->site_terms ) ) {
    
    				// construct tax_query
    				$tax_query = array(
    					'taxonomy' 	=> 'site_category',
    					'field' 	=> 'id',
    					'terms' 	=> $this->site_terms,
    					'operator' 	=> 'IN'
    					);
    
    				// this needs to be an array of arrays
    				$taxquery = array(
    					$tax_query
    				);
    
    				// set this..
    				$query->set( 'tax_query', $taxquery );
    
    				if ( $query->is_singular ) {
    
    					global $wpdb;
    
    					$q = &$query->query_vars;
    
    					$q['suppress_filters'] = false;
    
    					$query->parse_tax_query( $q );
    
    					$clauses = $query->tax_query->get_sql( $wpdb->posts, 'ID' );
    
    					$this->sql_join 	.= $clauses['join'];
    					$this->sql_where 	.= $clauses['where'];
    				}
    			}
    
    			return $query;
    		}
    
    		function filter_join( $join ) {
    
    			if ( !empty( $this->sql_join ) ) {
    				$join .= $this->sql_join;
    			}
    
    			return $join;
    		}
    
    		function filter_where( $where ) {
    
    			if ( !empty( $this->sql_where ) ) {
    				$where .= $this->sql_where;
    			}
    
    			return $where;
    		}
    	}
    
    	// not the admin? init class
    	if ( !is_admin() ) {
    		$pf_override = new PF_override();
    	}
    
        ?>

    This part was added:

    if ( $query->is_singular ) {
    
    	global $wpdb;
    
    	$q = &$query->query_vars;
    
    	$q['suppress_filters'] = false;
    
    	$query->parse_tax_query( $q );
    
    	$clauses = $query->tax_query->get_sql( $wpdb->posts, 'ID' );
    
    	$this->sql_join 	.= $clauses['join'];
    	$this->sql_where 	.= $clauses['where'];
    }

Topic Closed

This topic has been closed to new replies.

About this Topic