web-dev-qa-db-fra.com

Comment filtrer une archive de type de publication personnalisée par méta-valeur

J'ai un problème où je tente de créer un plug-in de calendrier pour un client. Je ne parviens pas à obtenir une archive basée sur les dates pour le type de publication personnalisé que j'utilise. Je ne suis pas trop au courant de la façon dont le système wordpress de gestion des permaliens est configuré à un niveau bas et je me suis heurté à un mur.

Arrière-plan:

Le plugin enregistre un type de publication personnalisé, event. Chaque événement a un champ de valeur méta appelé kultkal_date, contient une date sous la forme de 2011-09-28. (Les événements sont limités en ce sens que la date de chaque événement est également unique, par validation sur l'action save_post).

J'ai défini un permalien personnalisé pour le type de publication en tant que /kalendarie/%kultkal_year%/%kultkal_month%/%kultkal_day%, de sorte que l'URL terminée peut ressembler à /kalendarie/2011/09/28/my-slug. J'ai ajouté des balises de réécriture pour le lien permanent personnalisé à l'aide de l'action init, comme suit:

add_rewrite_tag('%kultkal_year%','([0-9]{4})');
add_rewrite_tag('%kultkal_month%','([0-9]{2})');
add_rewrite_tag('%kultkal_day%','([0-9]{2})');

J'ai une fonction pour corriger le lien permanent qui s'exécute sur le filtre post_type_link:

function filter_post_type_link($link, $post){
    if ($post->post_type != 'event')
        return $link;

    if ($date = get_post_meta($post->ID, 'kultkal_date', true)) {
        $dates = explode('-', $date);
        $year = $dates[0];
        $month = $dates[1];
        $day = $dates[2];
    } else {
        return $link;
    }
    $link = str_replace('%kultkal_year%', $year, $link);
    $link = str_replace('%kultkal_month%', $month, $link);
    $link = str_replace('%kultkal_day%', $day, $link);
    return $link;
}

Voir des publications individuelles fonctionne. Il en va de même pour la page d'archivage (située à l'adresse /kalendarium/: has_archive est défini sur kalendarium lorsque j'enregistre le type de publication).

Le problème commence lorsque je souhaite filtrer les publications par année - par exemple, /kalendarium/2011/ ou /kalendarium/2011/09/28/ etc. J'ai trouvé une réponse sur la manière de filtrer en fonction de la méta-valeur de la date sur les publications intégrées, ici: Liste des archives Filtrée par Valeurs de date dans un champ personnalisé/Post Meta? - mais cela ne semble pas fonctionner avec les types de publication personnalisés. Dès que j'ajoute des paramètres/année/mois/jour pour le tester, je récupère les archives du type de message intégré, pas même un 404. (Jusqu'à présent, je n'ai essayé que la première version de la réponse ci-dessus , avec tous les paramètres (année/mois/date), pas celui avec toutes les combinaisons + hook pour posts_where etc.

Voici à quoi ressemble la fonction (endommagée) sur laquelle j'ai exécuté pre_get_posts:

function event_pre_get_posts($query) {
    global $wp_the_query;
    if ($query === $wp_the_query && $query->is_archive()) {
        $qv = &$query->query_vars;
        if (isset($qv['kultkal_year']) && isset($qv['kultkal_month']) && isset($qv['kultkal_day'])) {
            $date = mktime(0,0,0,$qv['kultkal_month'],$qv['kultkal_day'],$qv['kultkal_year']);
            $qv['meta_key'] = 'kultkal_date';
            $qv['meta_value'] = date("Y-m-d", $date);
        }
    }
}

Des idées sur la façon de réaliser la solution que je cherche?

4
Emil Björklund

Comme Bainternet l'a dit dans des commentaires, vous aurez besoin de manipuler add_query_var ainsi que add_rewrite_rule.

Nous faisons habituellement quelque chose de similaire à:

global $wp;
$wp->add_query_var( 'some_var' );
add_rewrite_rule( 'some/path/([^/]+)/?$', 'index.php?some_var=$matches[1]' );

Voir ce billet Wordpress Trac , ainsi que la documentation sur add_query_var et add_rewrite_rule

1
Tyler Carter