Supporto » Sviluppare con WordPress » pagina categoria filtrata per custom field

  • Buongiorno a tutti.

    Premesso che non sono uno sviluppatore e ho una conoscenza da amatore di php, vorrei ottenere questo risultato e, se possibile, capire la logica che ci sta dietro:

    Ho degli articoli categorizzati, le categorie sono, per esempio

    – Hotel
    – Resort
    – Restaurants

    Ogni articolo ha un custom field per le nazioni, il valore della nazione è univoco per tutti gli articoli, nel senso che ho il post type country e l’articolo associa con una select la country ai post.

    In pratica vorrei che il risultato della category “Hotels” sia anche filtrato per quel custom field da URL.

    Una cosa del genere: miosito.com/category/hotels?country=Italy

    e mi ritorni una lista di tutti gli articoli che stanno nella categoria hotel e che hanno il campo country=italy

    Ho bisogno di fare questa query e passarle ai link personalizzati del menu.

    Grazie a tutti anticipatamente per il supporto

Stai vedendo 1 repliche (di 1 totali)
  • Ciao @abrugora,

    Per fare quello che ti serve ti basta usare la hook pre_get_posts che si aziona per ogni query, verifichi che la query sia quella corretta, prelevi il dato d $_GET['country'], ed utilizzi la meta_query di cui puoi leggere in https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

    una volta che la query è stata settata ricorda di rimuovere il filtro per prevenire che questo sia eseguito per ogni altra query.

    In codice è qualcosa del genere:

    
    function my_custom_field_country_query_filter( \WP_Query $query ) {
    
    	if ( is_admin() ) {
    		return;
    	}
    
    	$meta_value = filter_input( INPUT_GET, 'country', FILTER_SANITIZE_STRING );
    	if ( ! $meta_value ) {
    		return;
    	}
    
    	if ( ! $query->is_main_query() ) {
    		return;
    	}
    
    	$queried    = get_queried_object();
    	$taxonomies = [];
    
    	if ( $queried instanceof \WP_Term ) {
    		$taxonomies = array_filter( (array) $queried->taxonomy,
    			function ( $taxonomy ) {
    				return is_object_in_taxonomy( 'post', $taxonomy );
    			}
    		);
    	}
    
    	$post_type = isset( $query->query_vars['post_type'] ) ? $query->query_vars['post_type'] : '';
    	if ( empty( $taxonomies ) && 'post' !== $post_type && ! is_home() ) {
    		return;
    	}
    
    	$meta_query = $query->get( 'meta_query' );
    
    	if ( ! $meta_query ) {
    		$meta_query = [];
    	} else {
    		$meta_query['relation'] = 'AND';
    	}
    
    	$meta_query = array_merge( $meta_query,
    		[
    			[
    				'key'     => 'country',
    				'value'   => $meta_value,
    				'compare' => '=',
    			],
    		]
    	);
    
    	$query->set( 'meta_query', $meta_query );
    	$query->set( 'ignore_sticky_posts', true );
    
    	remove_action( 'pre_get_posts', 'my_custom_field_country_query_filter' );
    }
    
    add_action( 'pre_get_posts', 'my_custom_field_country_query_filter' );
    

    Fagli qualche test, io ne ho fatti alcuni per home, categorie etc… ma meglio testare in vari contesti e che non crei conflitti con altri tuoi dati.

    Quello che fa di base è controllare che la query sia quella corretta quindi se non è per un articolo o per un termine di tassonomia che non è registrato per il post type post non effettua la modifica della query.

    Una volta aggiunto il dato alla query il filtro viene rimosso così da evitare di eseguirlo più e più volte inutilmente.

    Caso particolare la home se non hai settato nulla in WordPress non hai contesto e vengono prelevati i posts quindi non c’è un post type impostato nella query e per la pagina di archivio dei termini per cui il post type non esiste nella query e dipende tutto dal fatto che il termine appartenga alla tassonomia registrata per essere usata insieme al post type o meno.

Stai vedendo 1 repliche (di 1 totali)
  • Devi essere collegato per rispondere a questo topic.