Dans mon projet WordPress, j'ai plusieurs custom post types
différents et ils partagent tous un common taxonomy. Je suis dans la phase finale du projet et il est maintenant temps de lier tous les types de publication personnalisés à l'aide d'un widget de barre latérale. Le problème que je rencontre est que je ne connais pas le moyen approprié pour associer le term link
au type de publication personnalisé approprié.
Par exemple, j'ai des types de publication personnalisés: livre, auteur, produit; et une taxonomie: genre qui inclut une catégorie d'horreur.
Je voudrais pouvoir obtenir la structure de lien en tant que telle:
/book/genre/horror
/product/genre/horror
/author/genre/horror
Lorsque je fais get_term_link('horror');
, j'obtiens l'un des liens de terme, il semble que l'un des types de publication personnalisée ait une préférence. Comment puis-je obtenir chaque lien correspondant au type de message personnalisé correct?
Ce n'est pas une bonne idée de coder durement, alors je me demandais s'il y avait un moyen approprié de s'y prendre. C'est un vieux problème que je rencontre et j'ai beaucoup cherché une solution, mais je ne l'ai pas trouvée. Je viens ici en dernier recours. Merci.
Ce code affiche toutes les publications de toutes les catégories de taxonomie de genre pour type de publication personnalisé book . Maintenant, pour un type de message personnalisé différent (auteur, produit), vous devez modifier le nom du type de message personnalisé dans $ arg de WP_Query (). Vous obtiendrez un lien de terme en utilisant la fonction get_term_link ($ catterm) ou vous pourrez aussi utiliser get_the_term_list () .
$args = array(
'number' => $number,
'hide_empty' => $hide_empty,
'include' => $ids
);
$custom_categories = get_terms( 'genre ', $args );
foreach ( $custom_categories as $catterm){
$arg = Array(
'post_type' => 'book',
'posts_per_page' => '-1',
'post_status' => 'publish',
'tax_query' => Array( Array (
'taxonomy' => 'genre ' ,
'terms' => $catterm->term_id
)) );
$loop = new WP_Query( $arg );
global $post;
while ( $loop->have_posts() ) : $loop->the_post();
?>
<div class="gallery-content">
<div class="entry-content">
<?php
echo '<li>' . get_the_title() . '</li>';
echo '<li><a href="'.get_term_link($catterm).'">'.$catterm->name.'</a></li>';
?>
</div>
</div>
<?php endwhile;
}
?>
Bonne nouvelle, j'ai trouvé un moyen d'y parvenir. Voici ma solution.
Prenant mon exemple ci-dessus, je vais vous expliquer ce que j'ai fait pour obtenir example.com/book/genre/horror
et indiquer le type de message personnalisé book
, la taxonomie genre
et la catégorie horror
.
De jolis permaliens devraient être activés. Allez dans Paramètres> Permaliens pour l'activer. Sinon, cela ne sert à rien. Alors on y va ...
1) Créez une page appelée book (et slug book), notez l'ID de page généré pour cette page après l'avoir publiée, vous en aurez besoin (vous pouvez le voir dans votre URL et devrait être un ?post=
avec l'ID de la page. en elle.)
2) Nous devons maintenant créer une réécriture afin de pouvoir pointer le lien vers la page de modèle correcte. Donc, dans votre fichier functions.php
(ou votre fichier plugin, à vous de choisir), vous devez ajouter ce code:
function my_rewrite_rules() {
add_rewrite_rule(
'book/genre/([[A-Za-z0-9\-]+)?/?$',
'index.php?page_id=1234&genre=$matches[1]',
'top'
);
flush_rewrite_rules();
}
add_action( 'init', 'my_rewrite_rules' );
Maintenant, remplacez 1234 par l'ID de page que vous avez généré pour la page book
. Et allez sur n'importe quelle page de garde et rechargez-la.
_ {Important: vous ne voulez pas exécuter flush_rewrite_rules();
chaque fois qu'une page est chargée sur votre site. Ceci est une fonction lourde et va ralentir les choses pour vous. Vous n'avez qu'à l'exécuter une fois sur le front end. Une fois que vous avez rechargé une page sur le front-end, les règles de réécriture sont vidées et vous pouvez supprimer cette ligne.
Ce que cette fonction fait, si une URL a la structure de /book/genre/ANYTHING_HERE/
, WordPress redirigera l'utilisateur vers la page avec l'ID de 1234 avec les données genre=ANYTHING_HERE
. Notez que ANYTHING_HERE est filtré via l'expression régulière fournie et qu'il accepte uniquement les caractères (majuscules et minuscules) de a-z, les chiffres 0 à 9 et les tirets (-).
3) Allez dans votre dossier de thèmes et créez un fichier appelé page-1234.php
(en remplaçant 1234 par votre ID de page, bien sûr.) Maintenant, dans ce fichier, vous pouvez faire toutes sortes de choses amusantes. Voici comment vous pouvez lister tous les livres par genre:
<?php
get_header();
global $wp_query;
$genre = $wp_query->query_vars['genre'];
$args = array(
'post_type' => 'book',
'tax_query' => array(
array(
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => $genre,
), ),
);
$books = new WP_Query( $args );
?>
<h1>Books of <?php echo $genre;?></h1>
<ul>
<?php foreach ( $books as $book ) : ?>
<li><?php echo $book->post_title; ?></li>
<?php endforeach; ?>
</ul>
<?php get_footer(); ?>
De plus, si vous ne travaillez pas avec des taxonomies, comme genre
dans cet exemple, vous pouvez utiliser vos balises personnalisées. Par ailleurs, le terme genre
ne fonctionne que dans cet exemple car il a été enregistré en tant que taxonomie. Si ce n'était pas le cas, vous pourriez ajouter une nouvelle balise à WordPress, à votre guise, en l'ajoutant à votre functions.php
en tant que tel:
function custom_rewrite_tag() {
add_rewrite_tag('%food%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);
À l'étape 2, remplacez genre
par la balise food
. Dans votre page-1234.php
, vous pouvez obtenir le query_vars['food']
, le manipuler comme bon vous semble et exécuter des requêtes telles que example.com/book/food/chocolate
. Notez que certains query_vars sont réservés. Vérifiez les ressources ci-dessous pour eux.
Pour terminer, pour que les liens pointent vers le type de message personnalisé et la taxonomie corrects, vous avez besoin d'une fonction personnalisée. C’est la seule façon pour moi d’y arriver et c’est comme ça:
function get_books_category_link( $category_slug ) {
$page = get_permalink( 1234 );
$link = '';
if ( '/%postname%/' == get_option('permalink_structure') ) {
$link = $page . 'genre/' . $category_slug;
} else {
$link = add_query_arg( array( 'genre' => $category_slug ) , $page );
}
return $link;
}
Et c'est tout! J'espère que ça aide. Quelques excellentes lectures ci-dessous, en particulier l'article de Stephen Harris ont vraiment contribué à la compréhension de l'API de réécriture. Merci.
Tuts + L'API de réécriture: notions de base