web-dev-qa-db-fra.com

Comment créer une archive pour un type de publication personnalisé à partir d'un plugin?

Je crée donc un plugin pour créer des bâtiments qui répertorient les condos à vendre. La manière la plus simple de faire cela était de créer un type de message personnalisé pour les bâtiments, puis les listes, mais je suis maintenant bloqué sur la façon de les afficher dans une archive. J'ai fait quelque chose de similaire en développant des thèmes pour lesquels je créerais simplement une archive-my_post_type.php et single-my_post_type.php, mais je ne sais pas comment prévoir la manière dont les thèmes pourraient être développés.

J'ai trouvé un réponse sur le dépassement de pile qui vous permet de détourner le modèle choisi, mais je crains que les fichiers de modèle ne soient pas seulement get_header () et the_content () etc ...

Qu'est-ce qui est considéré comme la meilleure pratique pour ce genre de chose? Dois-je simplement récupérer get_template_part_content et le remplacer par ma boucle personnalisée? Ou pirater le modèle choisi comme la réponse ci-dessus et espérer le meilleur?

5
Gazillion

Incluez vos fichiers modèles dans votre plugin. Je colle le mien dans/plugin/templates.

Vous devez vous connecter à l'emplacement du modèle pour ce modèle:

add_filter('archive_template', 'yourplugin_get_custom_archive_template');

function yourplugin_get_custom_archive_template($template) {
    global $wp_query;
    if (is_post_type_archive('yourCPT')) {
        $templates[] = 'archive-yourCPT.php';
        $template = yourplugin_locate_plugin_template($templates);
    }
    return $template;
}

Rincez et répétez avec les contrôles appropriés pour chaque modèle que vous souhaitez implémenter (simple, taxonomie, etc.).

function yourplugin_locate_plugin_template($template_names, $load = false, $require_once = true ) {
    if (!is_array($template_names)) {
        return '';
    }
    $located = '';  
    $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename(__FILE__), "", plugin_basename(__FILE__));
    foreach ( $template_names as $template_name ) {
        if ( !$template_name )
            continue;
        if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
            $located = STYLESHEETPATH . '/' . $template_name;
            break;
        } elseif ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
            $located = TEMPLATEPATH . '/' . $template_name;
            break;
        } elseif ( file_exists( $this_plugin_dir . '/templates/' . $template_name) ) {
            $located =  $this_plugin_dir . '/templates/' . $template_name;
            break;
        }
    }
    if ( $load && $located != '' ) {
        load_template( $located, $require_once );
    }
    return $located;
}

Le faire de cette façon signifie que WP cherchera d’abord vos thèmes dans le thème, mais retombera dans le dossier des modèles du plugin s’ils ne se trouvent pas dans votre thème. Si les utilisateurs souhaitent modifier les modèles en fonction de leur thème, ils peuvent simplement les copier dans le dossier de leur thème.

Si vous voulez être vraiment intelligent, vous pouvez forcer la vérification des modèles dans leur dossier de thèmes et charger des styles par défaut s'ils utilisent la copie du plugin des modèles:

add_action('switch_theme', 'yourplugin_theme_check');
add_action('wp_enqueue_scripts', 'yourplugin_css');


function yourplugin_css() {
    if(get_option('yourplugin-own-theme') != true && !is_admin()) {
    wp_enqueue_style('yourplugin-styles', plugins_url('/css/yourplugin.css', __FILE__));
    }
}

function yourplugin_theme_check() {
    if(locate_template('archive-yourCPT.php') != '' && locate_template('single-yourCPT.php') != '' && locate_template('taxonomy-yourTaxonomy.php') != '' && locate_template('taxonomy-anotherTaxonomy.php') != '') {
    update_option('yourplugin-own-theme', true);
     }   
     else {
     update_option('yourplugin-own-theme', false);
     }
}
5
Chris Cox