logo

Création complète d’un custom post type sous wordpress

Toujours un peu compliqué d’avoir cette fonction pourtant très intéressante sur WordPress, qui ne facilite pas du tout la tache pour cette création.  Voici un tutorial (à copier coller) pour vous faciliter les choses. Nous avons souhaiter rendre plus simple la création de ce Custom Post Type.

Les customs post types nous permettent de créer un type de post personnalisé qui peut être associé à des taxonomies ou pas. Dans ce tutoriel nous allons créer un custom post type et l’associé a une catégorie et une étiquette personnalisées.

Pour cela nous devons ajouter des lignes de code à notre fichier functions.php. Nous avons commencé pas préparer le terrain et créer des variables globales pour faciliter le changement des noms.

Création des variables globale dans fonctions.php :

//Variables globals pour la création d'un custom post type et ses fonctions

$nom_custom_post_type = 'portfolio'; //nom de votre custom post type
$nom_categorie_default_term = 'portfolio'; //nom du terme qu'on doit mettre par défaut dans la catégorie de custom post type
$nom_custom_categorie = 'port_cat'; // nom de la catégorie de notre post type (n'utiliser pas les majuscules)
$nom_custom_label = 'port_etiquette'; // nom d'étiquette de notre costum post type(n'utiliser pas les majuscules)

 

Création du CPT

toujours dans functions.php

//fonction de création d'un custom post type
function wp_cpt() {

    global $nom_custom_post_type;
    
    
    $labels = array(
        'name'                => _x($nom_custom_post_type, 'Post Type General Name'),
        'singular_name'       => _x($nom_custom_post_type, 'Post Type Singular Name'),
        'menu_name'           => __($nom_custom_post_type),
        'name_admin_bar'      => __($nom_custom_post_type),
        'parent_item_colon'   => __('Parent Item:'),
        'all_items'           => __($nom_custom_post_type),
        'add_new_item'        => __('Ajouter un '. $nom_custom_post_type),
        'add_new'             => __('Ajouter'),
        'new_item'            => __('Nouveau'),
        'edit_item'           => __('Modifier'),
        'update_item'         => __('Mettre a jour'),
        'view_item'           => __('Visualiser'),
        'search_items'        => __('Chercher'),
        'not_found'           => __('Rien trouvé'),
        'not_found_in_trash'  => __('rien trouvé dans la corbeille'),
    );
    $rewrite = array(
        'slug'                => _x($nom_custom_post_type, $nom_custom_post_type),
        'with_front'          => true,
        'pages'               => true,
        'feeds'               => false,
    );
    $args = array(
        'label'               => __($nom_custom_post_type),
        'description'         => __($nom_custom_post_type),
        'labels'              => $labels,
        'supports'            => array('title', 'editor', 'excerpt', 'thumbnail', 'comments', 'revisions', 'custom-fields'),
        'taxonomies'          => array($nom_custom_post_type . '_type'/*, 'category'*/),
        'hierarchical'        => false,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'        => true,
        'menu_icon'           => 'dashicons-megaphone',
        'show_in_admin_bar'   => true,
        'show_in_nav_menus'   => true,
        'can_export'          => true,
        'has_archive'         => false,
        'exclude_from_search' => false,
        'publicly_queryable'  => true,
        'query_var'           => $nom_custom_post_type,
        'rewrite'             => $rewrite,
        'capability_type'     => 'page',
    );
    register_post_type($nom_custom_post_type, $args);   
}

add_action('init', 'wp_cpt', 10);

 

Pour que nos pôst CPT s’affichent sur le site (en fonction de votre thème) et dans vos recherches.

dans functions.php

//affichage de custom post type sur wordpress

function wp_cpt_accueil($query) {
    global $nom_custom_post_type;
    $nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
    $nom_post_lowercase = strtolower($nom_post_replaced);

    if (! is_admin() && $query->is_main_query()) {
      if ($query->is_home) {
        $query->set('post_type', array('post', $nom_post_lowercase));
      }
    }
}
  
add_action('pre_get_posts','wp_cpt_accueil');

//affichage de post dans la recherche

function wp_cpt_recherche($query) {
    global $nom_custom_post_type;
    $nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
    $nom_post_lowercase = strtolower($nom_post_replaced);

    if (! is_admin() && $query->is_main_query()) {
      if ($query->is_search) {
        $query->set('post_type', array('post', $nom_post_lowercase));
      }
    }
}
  
add_action('pre_get_posts','wp_cpt_recherche');

 

Création des catégories et étiquettes CPT

Dans functions.php

// Création des catégorie et étiquettes
function wp_add_taxonomies_category() {

    global $nom_custom_post_type;
    global $nom_custom_categorie;
    $nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
    $nom_post_lowercase = strtolower($nom_post_replaced);
    $nom_custom_categorie_replaced = str_replace(" ", "", $nom_custom_categorie);
    
    $labels_cat_custom_actu = array(
        'name'                       => _x( 'Catégorie', 'taxonomy general name'),
        'singular_name'              => _x( 'Catégorie', 'taxonomy singular name'),
        'search_items'               => __( 'Rechercher une catégorie'),
        'popular_items'              => __( 'Catégories populaires'),
        'all_items'                  => __( 'Toutes les catégories'),
        'edit_item'                  => __( 'Editer une catégorie'),
        'update_item'                => __( 'Mettre à jour une catégorie'),
        'add_new_item'               => __( 'Ajouter une nouvelle catégorie'),
        'new_item_name'              => __( 'Nom de la nouvelle catégorie'),
        'add_or_remove_items'        => __( 'Ajouter ou supprimer une catégorie'),
        'choose_from_most_used'      => __( 'Choisir parmi les catégories les plus utilisées'),
        'not_found'                  => __( 'Pas de catégories trouvées'),
        'menu_name'                  => __( 'Catégorie' ),
    );
    
    $args_cat_custom_actu = array(
    // Si 'hierarchical' est défini à true, notre taxonomie se comportera comme une catégorie standard
        'hierarchical'          => true,
        'labels'                => $labels_cat_custom_actu,
        'show_ui'               => true,
        'show_in_rest'          => true,
        'show_admin_column'     => true,
        'query_var'             => true,
        'rewrite'               => array( 'slug' => $nom_custom_categorie_replaced ),
    );
    
    register_taxonomy( $nom_custom_categorie_replaced, $nom_post_lowercase, $args_cat_custom_actu );

}

add_action( 'init', 'wp_add_taxonomies_category', 0 );

function wp_add_taxonomies() {

    global $nom_custom_post_type;
    global $nom_custom_label;
    $nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
    $nom_post_lowercase = strtolower($nom_post_replaced);
    $nom_custom_label_replaced = str_replace(" ", "", $nom_custom_label);

    $labels_custom_actu = array(
        'name'                          => _x( 'Étiquettes', 'taxonomy general name'),
        'singular_name'                 => _x( 'Étiquette', 'taxonomy singular name'),
        'search_items'                  => __( 'Chercher une étiquette'),
        'all_items'                     => __( 'Toutes les étiquettes'),
        'edit_item'                     => __( 'Editer les étiquettes'),
        'update_item'                   => __( 'Mettre à jour les étiquettes'),
        'add_new_item'                  => __( 'Ajouter une nouvelle étiquette'),
        'new_item_name'                 => __( 'Valeur de la nouvelle étiquette'),
        'separate_items_with_commas'    => __( 'Séparer les étiquettes avec une virgule'),
        'menu_name'                     => __( 'Mots-clés' ),
    );

    $args_custom_actu = array(
    // Si 'hierarchical' est défini à false, notre taxonomie se comportera comme une étiquette standard
        'hierarchical'      => false,
        'labels'            => $labels_custom_actu,
        'show_ui'           => true,
        'show_in_rest' => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array( 'slug' => $nom_custom_label_replaced ),
    );

    register_taxonomy( $nom_custom_label_replaced, $nom_post_lowercase, $args_custom_actu );

}

add_action( 'init', 'wp_add_taxonomies', 0 );

 

Régler les permaliens (réglages>permaliens) on enregistre les « modifications ». Histoire de mettre à jour les nouvelles données.

Ensuite il est nécessaire de changer votre « breadcrumb » (fil d’Ariane) si vous avez choisi d’en afficher un dans votre thème. Cette version de breadcrumb est complète et permet l’affichage des CPT avec les sous catogies …

Dans functions.php

// le fil d'Ariane
function the_breadcrumb()
{
    echo '<nav class="fildariane" aria-label="Breadcrumb">';
    if (!is_front_page()) {
        echo '<span class="icon"><i class="fa fa-compass" aria-hidden="true"></i></span><a title="Accueil" rel="nofollow" href="';
        echo get_option('home');
        echo '">';
        echo 'Accueil';
        echo "</a><span class='icon'><i class='fa fa-angle-right' aria-hidden='true'></i></span>";
        if (is_single()){
            global $post;
            global $nom_custom_post_type;
            global $nom_custom_categorie;

            $nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
            $nom_post_lowercase = strtolower($nom_post_replaced);
            $nom_custom_categorie_replaced = str_replace(" ", "", $nom_custom_categorie);

            switch($post->post_type){
                case 'post' :
                    $postcat = get_the_category( $post->ID );
                    $term_id   = $postcat[0]->term_id;
                    echo get_term_parents_list( $term_id, 'category', array( 'separator' => '<span class="icon"><i class="fa fa-angle-right" aria-hidden="true"></i></span>' ) );
                break;
                case $nom_post_lowercase : // Ajouter ce cas pour le traitement de notre post type
                    $postcat = get_the_terms($post->ID, $nom_custom_categorie_replaced); //recuperations des termes de la custon catégorie
                    $term_id   = $postcat[0]->term_id;
                    echo get_term_parents_list( $term_id, $nom_custom_categorie_replaced, array( 'separator' => '<span class="icon"><i class="fa fa-angle-right" aria-hidden="true"></i></span>' ) );
                break;
            }
            echo the_title();
        }
        if (is_category()) {
            $query_obj = get_queried_object();
            $term_id   = $query_obj->term_id;
            $taxonomy  = get_taxonomy( $query_obj->taxonomy );
            if ( $term_id && $taxonomy ) {
                $parents = get_term_parents_list( $term_id, $taxonomy->name, array( 'inclusive' => false, 'separator' => '<span class="icon"><i class="fa fa-angle-right" aria-hidden="true"></i></span>' ) );
            }
            echo $parents.''.$query_obj->name;
        }
        if (is_archive() && !is_category() && !is_post_type_archive()) {// affichage des postes d'un terme de notre custom catégorie
            $query_obj = get_queried_object();
            $term_id   = $query_obj->term_id;
            $taxonomy  = get_taxonomy( $query_obj->taxonomy );
            if ( $term_id && $taxonomy ) {
                $parents = get_term_parents_list( $term_id, $taxonomy->name, array( 'inclusive' => false, 'separator' => '<span class="icon"><i class="fa fa-angle-right" aria-hidden="true"></i></span>' ) );
            }
            if($parents){
                single_cat_title($parents);
            }else{
                single_cat_title();
            }
        }
        if (is_post_type_archive()) {
            post_type_archive_title();
        }
        if (is_home()) {
            single_post_title();
        }
        if (is_page()) {
            $ancestors = get_post_ancestors($post);
            if ($ancestors) {
                $ancestors = array_reverse($ancestors);
                foreach ($ancestors as $crumb) {
                    echo '<a href="' . get_permalink($crumb) . '">' . get_the_title($crumb) . '</a><span class="icon"><i class="fa fa-angle-right" aria-hidden="true"></i></span> ';
                }
            }
            echo the_title();
        }
        if (is_search()) {
            echo sprintf( __( '%s Search Results for ', 'emandarine' ), $wp_query->found_posts );
            echo sprintf( __('"', 'emandarine' ), $wp_query->found_posts );
            echo get_search_query().'"';
        }
    }
    echo '</nav>';
}

 

Création d’un catégorie par défaut au lieu de « Non Classé »

dans functions.php

// création d'une catégorie par défaut
function my_registered_taxonomy($taxonomy, $object_type, $args){

global $nom_categorie_default_term;
global $nom_custom_post_type;
$nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
$nom_post_lowercase = strtolower($nom_post_replaced);

if(empty($terms) && $args['hierarchical'] && $object_type === $nom_post_lowercase){
if(isset($nom_categorie_default_term)){
if(!empty($nom_categorie_default_term)){
wp_insert_term(
$nom_categorie_default_term, // the term
$taxonomy, // the taxonomy
array(
'description'=> $taxonomy,
'slug' => $taxonomy,
)
);
}else{
wp_insert_term(
'non classé', // the term
$taxonomy, // the taxonomy
array(
'description'=> $taxonomy,
'slug' => $taxonomy,
)
);
}

}else{
wp_insert_term(
'non classé', // the term
$taxonomy, // the taxonomy
array(
'description'=> $taxonomy,
'slug' => $taxonomy,
)
);
}
}
}

add_action('registered_taxonomy', 'my_registered_taxonomy', 10, 3);

/term taxonomy par defaut

add_action('save_post', 'my_save_post');

function my_save_post($post_id){

global $nom_custom_post_type;
global $nom_categorie_default_term;
global $nom_custom_categorie;

$nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
$nom_post_lowercase = strtolower($nom_post_replaced);
$nom_custom_categorie_replaced = str_replace(" ", "", $nom_custom_categorie);

$post = get_post( $post_id );
if($post->post_type === $nom_post_lowercase){
$postcat = get_the_terms($post_id, $nom_custom_categorie_replaced);
if(!$postcat){
if(empty($nom_categorie_default_term) || !isset($nom_categorie_default_term)){
wp_set_object_terms( $post_id, 'non classé', $nom_custom_categorie_replaced );
}else{
wp_set_object_terms( $post_id, $nom_categorie_default_term, $nom_custom_categorie_replaced );
}

}

}
}

 

Cette fonction permet la fonction « Sticky » mettre en avant sur WordPress

dans function.php

//fonction mettre en avant sticky
function add_sticky_post_support(){
    global $post, $typenow;
    global $nom_custom_post_type;
    $nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
    $nom_post_lowercase = strtolower($nom_post_replaced); ?>
    
    <?php if ( $typenow == $nom_post_lowercase && current_user_can( 'edit_others_posts' ) ) : ?>
    <script>
    jQuery(function($) {
        var sticky = "<br/><span id='sticky-span'><input id='sticky' name='sticky' type='checkbox' value='sticky' <?php checked( is_sticky( $post->ID ) ); ?> /> <label for='sticky' class='selectit'><?php _e( "Stick this post to the front page" ); ?></label><br /></span>";    
        $('[for=visibility-radio-public]').append(sticky);  
    });
    </script>
    <?php endif; ?>
    
<?php
}
add_action( 'admin_footer-post.php', 'add_sticky_post_support' );
add_action( 'admin_footer-post-new.php', 'add_sticky_post_support' );

$mettre_en_avant_checkbox = false; // variable global pour ne pas avoir 2 checkbox 

function quick_edit_add($clumn_name, $post_type){
    global $post;
    global $nom_custom_post_type;
    $nom_post_replaced = str_replace(" ", "", $nom_custom_post_type);
    $nom_post_lowercase = strtolower($nom_post_replaced);
    if($post_type !== $nom_post_lowercase && $clumn_name !== 'option_name'){
        return;
    }

    global $mettre_en_avant_checkbox;
    if($mettre_en_avant_checkbox === false){
        echo '<input type="checkbox" name="sticky" >Mettre ce contenu en avant</input><br />';
        $mettre_en_avant_checkbox = true;
    }
}
add_action( 'quick_edit_custom_box', 'quick_edit_add', 10, 2 );