web-dev-qa-db-fra.com

Définir orderby dans l'URL

existe-t-il un moyen de définir l'ordre des publications via l'URL?

/ orderby/date/order/desc /

j'ai essayé plusieurs choses avec le succès de whiteout add_rewrite_rule.

add_action( 'init', 'wpse13483_init' );
function wpse13483_init()
{
    add_rewrite_rule( 'category/(.+?)/orderby/([^/]+)/order/([^/]+)(/page/?([0-9]{1,}))?/?$', 'index.php?category_name=$matches[1]&paged=$matches[5]&orderby=$matches[2]&order=$matches[3]', 'top' );
}

mieux, Dan.

2
v3nt

l'ajout dans le fichier functions.php fonctionne. n'oubliez pas de ré-enregistrer vos permaliens et vider le cache plusieurs fois pour voir les modifications.

add_action( 'init', 'wpse13483_init' );
function wpse13483_init() {
    add_rewrite_rule( 'category/(.+?)/orderby/([^/]+)?/?$', 'index.php?category_name=$matches[1]&orderby=$matches[2]&order=asc', 'top' );
    add_rewrite_rule( 'category/(.+?)/orderby/([^/]+)/order/([^/]+)?/?$', 'index.php?category_name=$matches[1]&orderby=$matches[2]&order=$matches[3]', 'top' );
//  with pagination;
    add_rewrite_rule( 'category/(.+?)/orderby/([^/]+)/order/([^/]+)/page/([0-9]{1,})?/?$', 'index.php?category_name=$matches[1]&orderby=$matches[2]&order=$matches[3]&paged=$matches[4]', 'top' );
}
1
v3nt

La création de règles de réécriture d'URL est totalement différente de à l'aide de variables de requête d'URL pour trier la requête de boucle .

Je suggérerais de s’attaquer à ce dernier, avant de s’inquiéter du premier.

Tout d'abord, vous devez enregistrer vos variables de requête d'URL, par exemple. (dans functions.php):

function mytheme_loop_sort_queryvars( $qvars ) {
    $qvars[] = 'loop_orderby';
    $qvars[] = 'loop_order';
    return $qvars;
}
add_filter( 'query_vars', 'mytheme_loop_sort_queryvars' );

Alors, maintenant que vous avez enregistré vos vars de requête, utilisez-les pour modifier la requête de boucle par défaut.

Commencez par préparer les variables de requête, par exemple (dans les fichiers de modèle appropriés ):

<?php

// Orderby Query Filter
$loop_orderby = '';
// Array of valid 'orderby' parameters, for validating the URL query string
$valid_loop_orderbys = array( 'ID', 'author', 'title', 'date', 'modified', 'parent', 'Rand', 'comment_count', 'menu_order' ); //note: excluding 'meta_value', for simplicity
// Do something only if the query var is set
if ( isset( $wp_query->query_vars['loop_orderby'] ) ) {
    // Make sure that only a valid 'orderby' parameter is used
    // If URL string value isn't valid, use default 'date'
    $title_filter = ( in_array( $wp_query->query_vars['loop_orderby'], $valid_loop_orderbys ) ? $wp_query->query_vars['loop_orderby'] : 'date' );
}
// Order Query Filter
$loop_order = '';
// Array of valid 'order' paramters, for validating the URL query string
$valid_loop_orders = array( 'ASC', 'DESC' );
// Do something only if the query var is set
if ( isset( $wp_query->query_vars['loop_order'] ) ) {
    // Make sure that only a valid 'order' parameter is used
    // If URL string value isn't valid, use default 'DESC'
    $title_filter = ( in_array( $wp_query->query_vars['loop_order'], $valid_loop_orders ) ? $wp_query->query_vars['loop_order'] : 'DESC' );
}
?>

Maintenant, utilisez les variables de requête pour modifier la boucle. Commencez par configurer votre tableau d'arguments personnalisé:

<?php
$custom_orderby_query_args = array();

if ( '' != $filter_loop_orderby ) {
    $custom_orderby_query_args['orderby'] = $filter_loop_orderby;
}
if ( '' != $filter_loop_order ) {
    $custom_orderby_query_args['order'] = $filter_loop_order;
}
?>

Maintenant, fusionnez votre tableau d'arguments personnalisés avec les arguments de requête de boucle par défaut:

<?php
// Globalize the default query
global $wp_query;
// Merge arguments
$customized_query_args = array_merge( $wp_query->query, $custom_orderby_query_args );
// Modify the query output
query_posts( $customized_query_args );
?>

Remarque: vous devrez déterminer exactement comment vous appliquez les chaînes de requête d'URL. Ce code utilise uniquement les chaînes de requête une fois qu'elles sont en place.

0
Chip Bennett