Recentemente mi è capitato di creare un piccolo catalogo prodotti su WordPress. Per farlo ho creato un custom post type “product” e una custom taxonomy “product_types”. Per visualizzare le pagine con i filtri per questa custom taxonomy ho creato un template di pagina ad hoc, chiamandolo taxonomy-{taxonomy}.php, ovvero taxonomy-product_types.php. Fin qui tutto bene, ma come fare se voglio ordinare i prodotti non per data (comportamento di default di wordpress) ma per qualche altro attributo o campo personalizzato? All’interno della nostra pagina taxonomy-product_types.php abbiamo il classico Loop di wordpress
1 |
<?php while (have_posts()) : the_post(); ?> |
e la “main query” viene creata automaticamente da WordPress, filtrando i prodotti per il termine della custom taxonomy visualizzata.
Come fare per modificare la main query e cambiare il tipo di ordinamento?
Basta aggiungere alcune righe di codice all’interno del file functions.php del nostro tema. Eccole qui:
1 2 3 4 5 6 7 8 |
add_action( 'pre_get_posts', 'order_products_by_menu_attribute' ); function order_products_by_menu_attribute($query) { if (is_tax("product_types")) { $query->set('orderby','menu_order'); $query->set('order','ASC'); } } |
In pratica ci agganciamo all’hooks “pre_get_posts“, passandogli una funzione che accetta come parametro la main query stessa. Il parametro viene passato “by reference”, quindi è possibile modificare direttamente la query cambiando, in questo caso, l’ordinamento.