web-dev-qa-db-fra.com

Possible de créer un lien permanent pour trier avec meta_key?

J'ai l'impression de parcourir tout le Web et de revenir à la recherche d'une réponse à cette question, et cela commence vraiment à brouiller les engrenages.

Pas sûr que ce soit la bonne façon de le faire, mais je veux ajouter un tableau query_posts à une URL sous la forme d'un query_arg. Voici notre requête:

query_posts( array( 'meta_key' => 'rank', 'orderby' => 'meta_value_num', 'order' => 'DESC' , 'paged' => $paged,

Comment utiliser add_query_arg pour transmettre cela à l'URL afin de réorganiser les publications avec ce tableau meta_key/query_posts? J'ai essayé ceci, cela ne semble pas changer l'ordre des messages, il y a quelque chose qui me manque ici.

<a href="<?php echo $by_rank;?>">  Rank </a>
     <?php $by_rank= esc_url(add_query_arg(array('meta_key' => 'rank',  'orderby' => 'meta_value_num', 'order' => 'DESC'))); ?>

La raison pour laquelle je souhaite ajouter les vars de requête à la chaîne d'URL est que les utilisateurs peuvent trier les publications sur les pages de catégorie en fonction de la méta_key/meta_value. En quelque sorte, de manière similaire à faire? Orderby = date, sauf avec une meta_key.

Cela peut être fait, non? Parce que je commence sérieusement à penser que ce n'est pas possible.

EDIT: - J'ai essayé, cela fonctionne pour trier les messages par ordre ASC/DESC, mais pas par la méta_key

<?php
$meta_key = (isset($_GET['meta_key'])) ?
            sanitize_text_field($_GET['meta_key']) : 'rank'; // use default value here ''

$orderby = (isset($_GET['orderby'])) ?
           sanitize_text_field($_GET['orderby']) : 'meta_value_num'; // use default value here ''

$order = (isset($_GET['order'])) ?
         sanitize_text_field($_GET['order']) : 'DESC'; // use default value here ''

$by_rank = esc_url(add_query_arg(array(
    'meta_key' => $meta_key,
    'orderby' => $orderby,
    'order' => $order
)));
?>
<a href="<?php echo $by_rank;?>">  Rank </a>

Je devrais ajouter que si j'ajoute le tableau query_posts directement dans le modèle de page, cela fonctionne parfaitement.

1
andy

Qu'en est-il quelque chose comme ça?

function wpse139657_orderby(){
    if( isset($_GET['orderby']) ){
        $order = $_GET['order'] or 'DESC';
        set_query_var('orderby', 'meta_value_num');
        set_query_var('meta_key', $_GET['orderby']);
        set_query_var('order', $order);
    }
}

add_filter('pre_get_posts','wpse139657_orderby');

De cette façon, vous pouvez appeler vos URL avec un suffixe ?orderby=rank et il devrait faire l'affaire. Vous pouvez également avoir un paramètre optionnel order, si vous souhaitez l'implémenter.

3
Sunyatasattva