web-dev-qa-db-fra.com

URL basées sur la date pour les publications personnalisées et la pagination

J'ai créé une structure permalien personnalisée pour un type de publication personnalisé (événements) à l'aide du code ci-dessous:

$GLOBALS["wp"]->add_query_var("event_year");
$GLOBALS["wp"]->add_query_var("event_monthnum");
$GLOBALS["wp"]->add_query_var("event_day");

$GLOBALS["wp_rewrite"]->add_rewrite_tag("%event%", "([^/]+)", "event=");
$GLOBALS["wp_rewrite"]->add_rewrite_tag("%event_year%", "([0-9]{4})", "event_year=");
$GLOBALS["wp_rewrite"]->add_rewrite_tag("%event_monthnum%", "([0-9]{1,2})", "event_monthnum=");
$GLOBALS["wp_rewrite"]->add_rewrite_tag("%event_day%", "([0-9]{1,2})", "event_day=");

$GLOBALS["wp_rewrite"]->add_permastruct("event", "/event/%event_year%/%event_monthnum%/%event_day%/%event%", false);

Pour la plupart, cela fonctionne comme prévu. Un problème se pose toutefois lorsque j'essaie d'utiliser la pagination sur une URL avec une année, un mois et une date. Dans ce cas, on suppose que "page" est la valeur de% event%.

J'ai utilisé le plugin Monkeyman Rewrite Analyzer où j'ai remarqué que le modèle requis (event/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$) est répertorié, mais uniquement après que le modèle qui tente d'utiliser l'argument de page comme nom de l'événement (event/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)(/[0-9]+)?/?$).

J'ai également remarqué que l'appel de $GLOBALS["wp_rewrite"]->rewrite_rules() après les définitions de réécriture faciliterait la pagination, mais romprait les URL avec les noms d'événements (event_year, event_monthnum, event_day et event se traduisent dans ce cas en $ 1, $ 2, $ 3 et $ 4).

En appelant $GLOBALS["wp_rewrite"]->flush_rules(), tout a fonctionné comme prévu, mais ce ne serait pas une bonne solution.

Existe-t-il un moyen de retourner les modèles de sorte que le modèle qui recherche une page vienne avant le modèle qui recherche un nom de publication?

5
Paul

L'appel de $ GLOBALS ["wp_rewrite"] -> flush_rules () a tout fait fonctionner comme je le voulais mais ce ne serait pas une bonne solution.

En fait, vous devez vider les règles de réécriture après les avoir modifiées (c’est-à-dire également lors de l’enregistrement de types de publication personnalisés).

En outre, vous ne devriez jamais compter sur ces variables globales. WordPress fournit des fonctions spécifiques pour presque tout. Par exemple, utilisez flush_rewrite_rules() au lieu de $GLOBALS["wp_rewrite"]->flush_rules(). C'est plus pérenne et maintenable.

Il est important d'appeler ces fonctions aux points d'action appropriés pour vous assurer que toutes les classes et fonctions nécessaires sont chargées. Quand, enveloppé dans un plugin, cela pourrait ressembler à ceci (non testé!):

    function events_87669_query_vars( $qvars ) {
    $qvars[] = 'event_year';
    $qvars[] = 'event_monthnum';
    $qvars[] = 'event_day';
    return $qvars;
}
add_filter('query_vars', 'events_87669_query_vars' );

function events_87669_rewrite_rules() {
    add_rewrite_tag("%event%", "([^/]+)", "event=");
    add_rewrite_tag("%event_year%", "([0-9]{4})", "event_year=");
    add_rewrite_tag("%event_monthnum%", "([0-9]{1,2})", "event_monthnum=");
    add_rewrite_tag("%event_day%", "([0-9]{1,2})", "event_day=");

    add_permastruct("event", "/event/%event_year%/%event_monthnum%/%event_day%/%event%", false);
}

add_action( 'init', 'events_87669_rewrite_rules' );

function events_87669_activation() {
    // Ensure our rewrite rules exist on plugin activation
    events_87669_rewrite_rules();

    flush_rewrite_rules();
}

function events_87669_activation() {
    flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'events_87669_activation' ) );
register_deactivation_hook( __FILE__, 'events_87669_deactivation' ) );

Ce code est fondamentalement identique au vôtre, sauf qu’il élimine correctement les règles de réécriture relatives à l’activation/la désactivation du plug-in. Nous nous assurons également que les règles de réécriture récemment ajoutées existent lors de l'activation. Et comme vous pouvez le constater, il existe un filtre spécial permettant d’ajouter des vars de requête personnalisés.

Vous trouverez un bon exemple de requête personnalisée sur le Codex WordPress: http://codex.wordpress.org/Custom_Queries Si vous souhaitez en savoir plus sur crochets et filtres: http://codex.wordpress.org/Plugin_API

Si quelqu'un connaît une meilleure solution, faites le moi savoir :)

2
swissspidy