C'est un problème tellement étrange. Je vais essayer de le décomposer aussi simplement que possible.
Je crée ma propre requête de page personnalisée qui fonctionne comme une archive utilisant des variables d'URL pour personnaliser les résultats de la requête.
Ceci est ma fonction getVar()
...
public static function getVar($name, $default = false) {
// check our param exists
if(isset($_REQUEST[$name])) {
return $_REQUEST[$name];
}
// return our default value
return $default;
}
Ceci est toute ma requête page-products.php ...
// get our filter params
$sSearch = CF::getVar('search', false);
$sCategory = CF::getVar('cat', false);
$sSweets = CF::getVar('sweets', false);
$sChocolates = CF::getVar('chocolate', false);
$sSnacks = CF::getVar('biscuits-snacks', false);
$sPackaging = CF::getVar('packaging', false);
$sSorting = CF::getVar('orderby', 'random');
// build our basic filters
$aFilters = array (
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => 100,
'orderby' => 'ASC',
'tax_query' => array (
'relation' => 'AND',
)
);
// filter by search query
if($sSearch) {
$aFilters['s'] = $sSearch;
}
// filter by product category
if($sCategory) {
// extend our filter array
$aFilters['tax_query'][] = array (
'taxonomy' => 'cat',
'field' => 'slug',
'terms' => array ($sCategory),
);
}
// filter by product sweets
if($sSweets) {
// extend our filter array
$aFilters['tax_query'][] = array (
'taxonomy' => 'confectionery',
'field' => 'slug',
'terms' => array ($sSweets),
);
}
// filter by product chocolates
if($sChocolates) {
// extend our filter array
$aFilters['tax_query'][] = array (
'taxonomy' => 'confectionery',
'field' => 'slug',
'terms' => array ($sChocolates),
);
}
// filter by product biscuits & snacks
if($sSnacks) {
// extend our filter array
$aFilters['tax_query'][] = array (
'taxonomy' => 'confectionery',
'field' => 'slug',
'terms' => array ($sSnacks),
);
}
// filter by product packaging
if($sPackaging) {
// extend our filter array
$aFilters['tax_query'][] = array (
'taxonomy' => 'packaging',
'field' => 'slug',
'terms' => array ($sPackaging),
);
}
// sorting select contents array
$aSorting = array (
'newest' => 'Latest products',
'oldest' => 'Oldest products',
'product_asc' => 'Product A-Z',
'product_desc' => 'Product Z-A'
);
if(User::logged_in()) {
// show price sorting in the dropdown
$aSorting['price_highest'] = 'Price high-low';
$aSorting['price_lowest'] = 'Price low-high';
}
// determine our sorting filters
switch($sSorting) {
case 'product_asc':
$aFilters['orderby'] = 'title';
$aFilters['order'] = 'ASC';
break;
case 'product_desc':
$aFilters['orderby'] = 'title';
$aFilters['order'] = 'DESC';
break;
case 'price_highest':
$aFilters['meta_key'] = 'product_starting_price';
$aFilters['orderby'] = 'meta_value_num';
$aFilters['order'] = 'DESC';
break;
case 'price_lowest':
$aFilters['meta_key'] = 'product_starting_price';
$aFilters['orderby'] = 'meta_value_num';
$aFilters['order'] = 'ASC';
break;
case 'oldest':
$aFilters['orderby'] = 'date';
$aFilters['order'] = 'ASC';
break;
case 'latest':
$aFilters['orderby'] = 'date';
$aFilters['order'] = 'DESC';
break;
case 'random':
default:
$aFilters['orderby'] = 'Rand';
$aFilters['order'] = 'DESC';
break;
}
// build our product object
$oProducts = new WP_Query($aFilters);
Donc tout ce qui précède fonctionne parfaitement. Chaque requête renvoie les résultats corrects.
Cependant, sur la requête cat
, j'ai remarqué que le chargement de la page prenait un peu plus de temps que les autres requêtes.
Alors j'ai vérifié ma console réseau et c'est ce qui se passe ...
products?cat=eco-range
Comme vous pouvez le voir ci-dessus, il charge deux fois. Cela n'a aucun sens?
Voir ci-dessous les résultats de mon réseau sur mes autres requêtes, qui sont toutes identiques, comme elles devraient être.
products?sweets=millions
products?packaging=gift-box-midi
products?search=110201
Si quelqu'un a une idée de la raison pour laquelle cela pourrait se produire ou peut m'aider à résoudre ce problème. Ce serait génial.
Merci d'avance.
Malheureusement, la réponse de Chris n'a apporté aucun changement. Voir la mise à jour modifiée
Ma catégorie personnalisée est maintenant enregistrée en tant que prod_cat
et mon URL var est également définie sur prod_cat
afin de ne pas entrer en conflit avec les termes réservés.
https://codex.wordpress.org/Reserved_Terms
https://codex.wordpress.org/WordPress_Query_Vars
Voici ma requête mise à jour sur mon page-products.php .
// get our filter params
$sCategory = CF::getVar('prod_cat', false);
// build our basic filters
$aFilters = array (
'post_type' => 'product',
'post_status' => 'publish',
'posts_per_page' => 100,
'orderby' => 'ASC',
'tax_query' => array (
'relation' => 'AND',
)
);
// filter by product prod_cat
if($sCategory) {
// extend our filter array
$aFilters['tax_query'][] = array (
'taxonomy' => 'prod_cat',
'field' => 'slug',
'terms' => array ($sCategory),
);
}
Et son chargement encore deux fois dans la console réseau.
Cela n'a aucun sens.
Je pense que c’est parce que cat est un paramètre de requête réservé. Essayez de le changer pour un nom différent comme "catégorie" ou simplement "c".
Si vous comparez les deux URL avant et après la redirection, sont-elles identiques ou légèrement modifiées?