web-dev-qa-db-fra.com

Taxonomie personnalisée dans le plugin et le modèle

Je développe un plugin qui utilise des types de post personnalisés et des taxonomies. Ma question est la suivante. Comment puis-je charger les données de contenu/thème de mon plug-in sur la page lorsque vous accédez à l'URL personnalisée de la taxonomie?

MODIFIER

J'essaie d'utiliser les fichiers de modèle du plug-in et non les thèmes de mon taxon personnalisé.

4
brenjt

Tout d'abord - les plugins servent à générer du contenu, les thèmes permettent de l'afficher . Donc, vraiment, un plugin ne devrait pas faire ça. Mais il existe des zones grises - par exemple, dans un plug-in lié à "événements", il serait souhaitable d'afficher les dates, le lieu, etc. - des éléments qu'un thème WordPress ne devrait pas afficher normalement.

Je voudrais suggerer

  • rendre les modèles de plug-ins superposables avec des modèles du même nom dans le thème theme/child.
  • Être capable de "désactiver" le plugin forçant du template.

Pour modifier le modèle utilisé, vous pouvez utiliser le filtre template_include. Ceci est un exemple pour les modèles de taxonomie, mais un processus similaire est possible pour les types de publication personnalisés.

add_filter('template_include', 'wpse50201_set_template');
function wpse50201_set_template( $template ){

    //Add option for plugin to turn this off? If so just return $template

    //Check if the taxonomy is being viewed 
    //Suggested: check also if the current template is 'suitable'

    if( is_tax('event-venue') && !wpse50201_is_template($template))
        $template = plugin_dir_url(__FILE__ ).'templates/taxonomy-event-venue.php';

    return $template;
}

Remarque il suppose que les modèles de plug-in se trouvent dans un sous-dossier de modèle relatif au directeur actuel.

Logique

Ceci vérifie simplement que la taxonomie "lieu de l'événement" est visualisée. Sinon, il utilisera le modèle d'origine.

La fonction wpse50201_is_template vérifiera si le modèle que WordPress a choisi dans le thème/thème-enfant s'appelle taxonomy-event-venue.php ou taxonomy-event-venue-{term-slug}.php. Si c'est le cas, le modèle d'origine sera utilisé.

Cela permet aux utilisateurs de votre plugin de les copier dans leur thème et de les éditer, et le plugin donnera la priorité aux modèles theme/child-theme. Ce n'est que s'il ne parvient pas à les trouver qu'il revient aux modèles de plug-in.

function wpse50201_is_template( $template_path ){

    //Get template name
    $template = basename($template_path);

    //Check if template is taxonomy-event-venue.php
    //Check if template is taxonomy-event-venue-{term-slug}.php
    if( 1 == preg_match('/^taxonomy-event-venue((-(\S*))?).php/',$template) )
         return true;

    return false;
}

J'ai utilisé cette méthode dans un plugin - vous pouvez voir un exemple de travail de ce qui précède ici .

7
Stephen Harris

C'est ainsi que j'appelle un modèle de taxonomie depuis un sous-répertoire de mon dossier de thèmes. Gardez à l'esprit que taxonomy.php devra rester dans votre répertoire de thème racine.

function call_taxonomy_template_from_directory(){
    global $post;
    $taxonomy_slug = get_query_var('taxonomy');
    load_template(get_template_directory() . "/templates-taxonomy/taxonomy-$taxonomy_slug.php");
}
add_filter('taxonomy_template', 'call_taxonomy_template_from_directory');

Par exemple, ma taxonomie s'appelle 'news-category'. Le modèle est situé à wp-content/themes/mytheme/templates-taxonomy/taxonomy-news-category.php

1
MikeT