web-dev-qa-db-fra.com

types de publication personnalisés, wp_get_archives et add_rewrite_rule

J'ai cherché pour voir si quelqu'un avait trouvé une solution à un problème particulier que je rencontrais, mais je n'ai rien trouvé qui soit proche de ce qui se passait dans mon cas.

J'ai deux types de messages personnalisés - appelons-les journal et journal. Les deux ont été configurés correctement avec has_archive to true , rewrite avec le même slug et with_front to false .

Ma structure de lien permanent est définie avec année/mois/post-name . J'ai mis en place des pages réservées, avec les journaux 'slary' et 'journal' de chaque slug pour que tous les posts que je fais dans ces types soient correctement chargés avec archive.php - donc si je vais dans domain/diary/ou domain/journal, ils charger en conséquence. Je ne fais pas de modèles supplémentaires ici - je crée juste un thème enfant de twentyeleven et j'utilise archive.php.

Je devais utiliser wp_get_archives pour travailler avec les types de publication personnalisés et le faire fonctionner avec l’option ajoutée post_type , j’ai fait un pas plus loin et créé une custom_wp_get_archives function afin que je peut personnaliser sa sortie car j'en aurai besoin plus tard.

Maintenant, c’est là que le problème commence, soit avec l’option wp_get_archive par défaut, avec l’option * post_type *, soit avec custom_wp_get_archives - l’URL qui en résulte la sortie est domaine/année/mois qui retourne un 404 quand j'y vais. Assez correct, mais si j'ajoute '? Post_type = POST_TYPE' à cette URL/à toute URL générée, j'obtiens des résultats en conséquence - assez correct encore une fois.

J'ai donc utilisé mon custom_wp_get_archives pour insérer '? Post_type = POST_TYPE' dans l'URL de sortie et cela a fonctionné.

Ma question est - est-il possible d'obtenir wp_get_archives pour afficher les URL correctes avec les conditions indiquées ci-dessus?

J'ai également examiné add_rewrite_rule ainsi que generate_rewrite_rules comme solution - c'est-à-dire: domain/post_type_slug/year/month - et suivi presque tous les exemples que j'ai trouvés ici et à d'autres endroits et cela ne fonctionne tout simplement pas. J'ai aussi vidé les permaliens - non.

Le code que j'ai trouvé qui semble être proche de ce que je veux qu'il fasse avec la réécriture des règles ne fonctionne pas non plus ici, il est:

function register_post_type_rewrite_rules($wp_rewrite) {

$args = array('public' => true, '_builtin' => false);   //get all public custom post types
$output = 'names';
$operator = 'and';
$post_types = get_post_types($args,$output,$operator);

$url_base = ($url_base == '') ? $url_base : $url_base . '/';
$custom_rules = array();

$post_types = implode('|', $post_types);
    $custom_rules = array( "$url_base($post_types)/([0-9]+)/([0-9]{1,2})/([0-9]{1,2})/?$" =>
            'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2) . '&monthnum=' . $wp_rewrite->preg_index(3) . '&day=' . $wp_rewrite->preg_index(4),       //year month day

                            "$url_base($post_types)/([0-9]+)/([0-9]{1,2})/?$"  =>
            'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2) . '&monthnum=' . $wp_rewrite->preg_index(3),          //year month
                            "$url_base($post_types)/([0-9]+)/?$" =>
            'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2)   //year
                        );

$wp_rewrite->rules = array_merge($custom_rules, $wp_rewrite->rules); // merge existing rules with custom ones

return $wp_rewrite;
}

add_filter('generate_rewrite_rules', 'register_post_type_rewrite_rules', 100);

Tout indice sur cela sera formidable.

2
george.n

Les types de publication personnalisés ne possèdent pas d'archives par date par défaut (j'entends par là vraiment qu'ils n'ont pas de structure de lien permanent pour leurs archives de date). Par exemple:

www.example.com?post_type=journal&year=2012&monthnum=4

devrait vous donner les archives des revues publiées en avril 2012. Cependant,

www.example.com/journal/2012/04

vous donnera probablement 404 car il n’existe pas de règle de réécriture. Vous devez les ajouter:

add_action('init', 'wpse50530_journal_archive_rewrite');
function wpse50530_journal_archive_rewrite(){
   add_rewrite_rule('^journal/([0-9]{4})/([0-9]{2})/?','index.php?post_type=journal&year=$matches[1]&monthnum=$matches[2]','top');
   add_rewrite_rule('^journal/([0-9]{4})/?','index.php?post_type=journal&year=$matches[1]','top');
}

vous donnera les archives du mois et de l'année. ( S'il vous plaît noter que ce qui précède est complètement non testé ). Vous devrez vider les règles de réécriture une fois après l’avoir ajouté (en consultant Paramètres> Lien permanent).

5
Stephen Harris