Accueil » Conseils & tutoriels sites internet » Tutoriels Wordpress » WordPress : créer des custom post types

WordPress : créer des custom post types

Posté dans : Tutoriels Wordpress 0

WordPress est un gestionnaire de contenu avec lequel il est possible de créer des custom post types, à savoir de nouveaux types de contenu autres qu’articles ou pages. WooCommerce permet d’emblée de bénéficier d’un contenu de type produit, mais nous allons voir dans ce tutoriel comment créer autant de types de contenu que l’on souhaite.

Dans l’exemple, je travaille sur un thème enfant, ce qui me permet une grande stabilité, mais si vous développez votre propre thème, vous pouvez aisément ajouter les fonctions dans votre functions.php. Pour créer un thème enfant, cliquez ici afin de retrouver le tutoriel de la Team.

Nous allons créer un contenu nommé « friends », de manière à créer des articles pour lister les amis avec du contenu rédactionnel, meilleur pour le SEO.

1/ La fonction custom post type à ajouter

La fonction (que vous pouvez retrouver dans le codex sur cette URL : http://codex.wordpress.org/Function_Reference/register_post_type) est simple. Pensez à toujours commenter votre code.

/***
 * Register a ami post type.
 *
 * @link http://codex.wordpress.org/Function_Reference/register_post_type
 */
function ami_init() {
  $labels = array(
    'name'               => _x( 'Amis', 'post type general name', 'virtue' ),
    'singular_name'      => _x( 'Ami', 'post type singular name', 'virtue' ),
    'menu_name'          => _x( 'Amis', 'admin menu', 'virtue' ),
    'name_admin_bar'     => _x( 'Ami', 'add new on admin bar', 'virtue' ),
    'add_new'            => _x( 'Ajouter', 'ami', 'virtue' ),
    'add_new_item'       => __( 'Ajouter un nouvel ami', 'virtue' ),
    'new_item'           => __( 'Nouvel ami', 'virtue' ),
    'edit_item'          => __( 'Editer ami', 'virtue' ),
    'view_item'          => __( 'Voir ami', 'virtue' ),
    'all_items'          => __( 'Tous les amis', 'virtue' ),
    'search_items'       => __( 'Rechercher amis', 'virtue' ),
    'parent_item_colon'  => __( 'Parent amis:', 'virtue' ),
    'not_found'          => __( 'No ami trouvé.', 'virtue' ),
    'not_found_in_trash' => __( 'Aucun ami trouvé dans la corbeille.', 'virtue' )
  );

  $args = array(
    'labels'             => $labels,
    'description'        => __( 'Description.', 'virtue' ),
    'public'             => true,
    'publicly_queryable' => true,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'query_var'          => true,
    'rewrite'            => array( 'slug' => 'ami' ),
    'capability_type'    => 'post',
    'has_archive'        => true,
    'hierarchical'       => false,
    'menu_position'      => null,
    'supports'           => array( 'title', 'editor', 'thumbnail', 'page-attributes' )
  );

  register_post_type( 'ami', $args );
}

add_action( 'init', 'ami_init' );

Comme précisé plus haut, le besoin est de disposer d’un blog dédié aux amis, mais qui soit bien détaché du blog. Nous aurions très bien pu créer un portfolio par ce biais, le custom post type est clairement utile dans ce cas.

Ce code suffit tout simplement à créer un custom post type directement accessible depuis l’administration de votre WordPress. Poussons donc le bouchon un petit peu plus loin en ajoutant des catégories à ce custom post type, tant qu’à faire, voire même des tags.

2/ Tags et taxonomies d’un custom post type

Pour enregistrer une taxonomie sur un custom post type, cela s’effectue avec register_taxonomy, tout bêtement. Cette fonction prend plusieurs paramètres, notamment le custom post type associé, son nom, la réécriture d’URL…

register_taxonomy( 'catégories', 'ami', array( 'hierarchical' => true, 'label' => 'Catégories', 'query_var' => true, 'rewrite' => true ) );

Ce code crée donc la taxonomie « Catégories », directement liée au custom post type « ami ». En une ligne. Encore plus simple que la précédente fonction.

En ce qui concerne les tags en revanche, le principe est le même mais nous allons détailler davantage via une nouvelle fonction PHP. Quelque part, les étiquettes sont des catégories non hiérarchisées. Comme par défaut les expressions liées aux tags sont d’ores et déjà traduites par WordPress, autant coder en anglais.

function create_tag_taxonomies() 
{
  $labels = array(
    'name' => _x( 'Tags', 'taxonomy general name' ),
    'singular_name' => _x( 'Tag', 'taxonomy singular name' ),
    'search_items' =>  __( 'Search Tags' ),
    'popular_items' => __( 'Popular Tags' ),
    'all_items' => __( 'All Tags' ),
    'parent_item' => null,
    'parent_item_colon' => null,
    'edit_item' => __( 'Edit Tag' ), 
    'update_item' => __( 'Update Tag' ),
    'add_new_item' => __( 'Add New Tag' ),
    'new_item_name' => __( 'New Tag Name' ),
    'separate_items_with_commas' => __( 'Separate tags with commas' ),
    'add_or_remove_items' => __( 'Add or remove tags' ),
    'choose_from_most_used' => __( 'Choose from the most used tags' ),
    'menu_name' => __( 'Tags' ),
  ); 

  register_taxonomy('tag','ami',array(
    'hierarchical' => false,
    'labels' => $labels,
    'show_ui' => true,
    'update_count_callback' => '_update_post_term_count',
    'query_var' => true,
    'rewrite' => array( 'slug' => 'tag' ),
  ));
}

Pensez donc à recharger la page de votre administration pour visualiser le tout. Notez au passage que je réutilise la fonction register_taxonomy, mais au préalable je détaille davantage les informations qui y sont liées. Cela permet en conséquent d’avoir une gestion et un affichage différent par rapport aux catégories

Voici le résultat obtenu sur un WordPress 4.7.3 (dernière version stable à l’heure où cet article est rédigé):

WordPress : créer des custom post types 1

Et si je cherche à ajouter un « ami » dans mon nouveau custom post type, cela me donne ceci :

WordPress : créer des custom post types 2

Soyons d’accord donc qu’une fois que ces fonctions ont été mises en place dans votre functions.php, vous pouvez les dupliquer pour ajouter autant de custom post types que vous souhaitez. Le design quant à lui est directement lié à la hiérarchie de vos fichiers dans votre thème, cela peut varier.

3/ Et c’est tout ?

Pas exactement. Il reste une petite modification à réaliser afin que votre custom post type soit bien accessible. Si vous enregistrer un élément d’un custom post type et cherchez à le visualiser, généralement c’est la page 404 garantie. Afin que les URL de vos custom post types soient bien pris en compte, il vous faut vous rendre dans « Réglages » puis « Permaliens », pour passer la réécriture des URL par défaut, et enfin la remettre en place.

Cela suffit à activer définitivement les custom post types.

Bon. Comme vous êtes peut-être encore sur votre faim, continuons avec l’ajout de petits champs directement liés au contenu de type « ami », qu’on appelle des meta_boxes.

Si vous n’avez nul besoin de modifier votre design, ou aucune nécessité d’ajouter des champs personnalisés dans l’admin pour les retraiter sur votre site, vous pouvez aller digérer votre code, le reste ne vous concernera pas.

4/ Ajout d’une meta box sur un custom post type

Ce qui serait judicieux sur le contenu « ami », ce serait de pouvoir insérer directement via un champ spécifique l’URL du site de l’ami en question, de manière à insérer directement un petit lien, dans un nouvel onglet « of course », et que l’on pourrait positionner sur un fichier php modifiable donc à souhait. Et tout de suite la barre monte encore plus haut.

Les fonctions sont cette fois-ci plus nombreuses, car nous devons ajouter un champ, et bien enregistrer la donnée.

Tout d’abord, la fonction qui permet d’afficher une meta box sur un contenu précis :

/***
 * Add boxe for custom url
 * http://codex.wordpress.org/Function_Reference/add_meta_box
 * Added by Cyril CHALAMON
**/
function customlink_add_meta_box() {

  $screens = array('ami');

  foreach ( $screens as $screen ) {
    add_meta_box(
      'customlink_sectionid',
      __( 'Ajout d\'un lien externe', 'virtue' ),
      'customlink_meta_box_callback',
      $screen
    );
  }
}
add_action( 'add_meta_boxes', 'customlink_add_meta_box' );

Comme $screens est en PHP un array, nous pouvons ajouter cette meta box sur plusieurs types de contenu sans souci. Ce qui donnerait une variable $screens qui serait ceci :

screens = array('ami','post','page');

La meta box serait par conséquent affichée sur mes contenus « ami », « article » et « page ». Et en image, voici à présent la meta box générée :

WordPress : créer des custom post types 3

Si le champ est renseigné, il est judicieux d’en afficher le contenu, de manière à ce qu’on puisse visualiser ce qui a été saisi.

La fonction (très simple) sous WordPress est celle-ci :

/***
 * Prints the box content.
 *
 * @param WP_Post $post The object for the current post/page.
 */
function customlink_meta_box_callback( $post ) {

  // Add a nonce field so we can check for it later.
  wp_nonce_field( 'customlink_save_meta_box_data', 'customlink_meta_box_nonce' );

  /**
   * Use get_post_meta() to retrieve an existing value
   * from the database and use the value for the form.
   */
  $value = get_post_meta( $post->ID, '_blank_link_key', true );

  echo '<label for="customlink_new_field">';
  _e( 'Merci de renseigner une URL complète', 'virtue' );
  echo '</label> ';
  echo '<input type="text" id="customlink_new_field" name="customlink_new_field" value="' . esc_attr( $value ) . '" size="100" />';
}

Bref, je n’aime pas trop cela, mais nous ne sommes pas loin d’un bon gros « copier-coller ». Pour une nouvelle meta box, il faudra ajouter une nouvelle fonction qui devra s’exécuter toujours sur le hook d’action add_meta_boxes. Ajoutez-en donc autant que nécessaire.

Comme noté dans le commentaire, nous utilisons la fonction get_post_meta pour récupérer sur le contenu en question ce qui a été enregistré dans le champ URL. WordPress récupère donc automatiquement dans la table de la base de données wp_postmeta la meta_value associée au contenu actuel, selon la meta key (qui ici est _blank_link_key). Vous verrez plus loin que get_post_meta sera réutilisé sur le front-office.

Si nous devions coder cela, nous aurions quelque chose comme ceci :

$queryLink = "SELECT meta_value
          FROM ".$wpdb->prefix."postmeta
          WHERE post_id = '".$postid."'
          AND meta_key = '_blank_link_key'
          ";

Puisque nous pouvons avoir le contenu plus facilement, autant ne pas se gêner. Il reste à enregistrer la donnée. WordPress nous fournit encore une fois via le codex la fonction à utiliser, qui est celle-ci :

/***
 * When the post is saved, saves our custom data.
 * @param int $post_id The ID of the post being saved.
 */
function customlink_save_meta_box_data( $post_id ) {

  /**
   * We need to verify this came from our screen and with proper authorization,
   * because the save_post action can be triggered at other times.
   */

  // Check if our nonce is set.
  if ( ! isset( $_POST['customlink_meta_box_nonce'] ) ) {
    return;
  }

  // Verify that the nonce is valid.
  if ( ! wp_verify_nonce( $_POST['customlink_meta_box_nonce'], 'customlink_save_meta_box_data' ) ) {
    return;
  }

  // If this is an autosave, our form has not been submitted, so we don't want to do anything.
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
    return;
  }

  // Check the user's permissions.
  if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {

    if ( ! current_user_can( 'edit_page', $post_id ) ) {
      return;
    }

  } else {

    if ( ! current_user_can( 'edit_post', $post_id ) ) {
      return;
    }
  }

  /** OK, it's safe for us to save the data now. */

  // Make sure that it is set.
  if ( ! isset( $_POST['customlink_new_field'] ) ) {
    return;
  }

  // Sanitize user input.
  $my_data = sanitize_text_field( $_POST['customlink_new_field'] );

  // Update the meta field in the database.
  update_post_meta( $post_id, '_blank_link_key', $my_data );
}
add_action( 'save_post', 'customlink_save_meta_box_data' );

Les différents tests dans cette fonction, qui est accrochée au hook save_post (donc à chaque enregistrement du contenu) permettent de vérifier si l’information existe, si la personne qui l’insère a bien les autorisations d’édition, etc. La donnée est à présent enregistrable et s’affiche bien dans mon contenu « ami » si j’enregistre.

Vous avez donc à présent créé un type de contenu spécifique, avec un système de catégories et d’étiquettes associé, et un champ personnalisé dans l’administration.

Il ne reste plus qu’à ajouter cette information dans votre thème afin de l’afficher !

5/ Création d’une mise en page pour le custom post type

Nous n’aurions pas eu la meta box, le contenu aurait très bien été géré. Il va falloir créer un fichier PHP dédié à ce type de contenu, de manière à bien afficher de façon automatisée l’URL saisie dans l’administration.

Commençons par créer une page qui listera tout le contenu de type « ami », un peu comme une page « blog ». Facile, nous allons pour cela créer un modèle de page.

a/ Création d’un modèle de page personnalisé

Un modèle de page (ou template) est directement accessible dans l’administration de WordPress via un petit menu déroulant dans la gestion d’une page. Ainsi la page affiche directement ce que l’on souhaite, selon comment nous l’avons codée.

Ici la page doit afficher son titre, son contenu, et la liste de tout le contenu de type ami. La chose étant bien définie, créez un fichier ami.php, placez-le à la racine de votre thème enfant, et mettez ceci à l’intérieur (de manière à ce que WordPress le reconnaisse bien) :

<?php
/*
Template Name: Page Ami
*/
?>

Le résultat est instantané :

WordPress : créer des custom post types 4

Copiez le contenu du fichier page.php du thème parent et coller-le dans le fichier ami.php. De la sorte, vous allez pouvoir profiter de l’existant, ce qui vous fera gagner du temps vis-à-vis de la gestion des sidebars, etc.

Ce qu’il nous faut, c’est un affichage de toute la liste des amis. Une boucle donc. Tiens donc ! La boucle est justement le cœur de WordPress, cela tombe très bien  !

Commençons par le commencement, à savoir la récupération des données utiles :

<?php
/*
Template Name: Ami
*/

    //Récupération de toutes les informations de la page en cours
    global $post;
    $pageID = $post->ID;
    $page = get_post($pageID);
    
    //Boucle permettant d'avoir tous les custom post type "ami"
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $loop = new WP_Query( array(
    'post_type' => 'ami',
    'posts_per_page' => 24,
    'orderby'=> 'id',
    'paged'=>$paged
    ) );

On est paré !

Comme mon header englobe le titre de ma page, nul besoin d’ajouter un the_title(), fonction de WordPress qui affiche le titre du contenu en cours. je passe donc directement à l’affichage du contenu de la page, avant de lister tous les amis.

Afficher le contenu de la page se présenterait normalement avec the_content, mais avec la préparation que nous avons effectuée au préalable, nous pouvons procéder ainsi :

 <?php
        echo $page->post_content;
    ?>

Ma variable $page possédant tout les éléments de la base de données pour ce contenu précis, je peux donc afficher tout ce que je souhaite. Vous allez voir que cela peut se révéler très utile à terme.

La boucle WordPress est en PHP une boucle while, qui va tourner jusqu’à ce qu’il n’y ai plus rien à traiter selon nos critères.

Elle se présente ainsi :

  <?php while ( $loop->have_posts() ) : $loop->the_post();

    <?php endwhile; ?>

Dans cette boucle (c’est-à-dire entre le while et le endwhile), vous disposez de toutes les informations de chaque contenu de type ami. En bon français, cela revient à dire : « pour chaque contenu de type ami, je veux… ». Et bien évidemment nous avons un paquet d’informations à disposition !

Bon, niveau design, je verrais bien une image la une qui s’affiche, et le titre en-dessous, le tout en Bootstrap (puisque mon thème l’utilise).

Let’s go.

  <?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
        <section id="ami-<?php echo $post->ID;?>" class="col-md-4 col-sm-4 col-xs-12 ami-post">
        </section>
    <?php endwhile; ?>

Ma section en Bootstrap est prête, j’y ai même mis l’ID de la page qui sera par exemple ami-1234. Je veux donc mettre dedans le lien, l’image à la une, et le titre.

Ce qui dans la boucle me donne ceci :

  <?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
        <section id="ami-<?php echo $post->ID;?>" class="col-md-4 col-sm-4 col-xs-12 ami-post">
            <a href="<?php echo get_permalink(); ?>">
                <img src="<?php echo wp_get_attachment_url( get_post_thumbnail_id($post->ID) ); ?>" style="width:100%;height:150px;background-color:#1e1e1e;" />
                <div class="ami-title">
                <?php
                    echo '<h2 class="gal_title">'.$post->post_title.'</h2>';
                ?>
                </div>
            </a>
        </section>
    <?php endwhile; ?>

Bon, ma page affiche désormais son titre, son contenu, la liste des amis avec l’image à la une, le tout en responsive grâce à Bootstrap. Je dispose de class et d’identifiants si toutefois je souhaite réagencer ou améliorer le design.

Si l’image est manquante, un bloc noir s’affiche dans mon cas, mais c’est un élément à traiter.

Sous Virtue, mon modèle de page se présente ainsi :

<?php
/*
Template Name: Ami
*/

    //Récupération de toutes les informations de la page en cours
    global $post;
    $pageID = $post->ID;
    $page = get_post($pageID);
    
    //Boucle permettant d'avoir tous les custom post type "ami"
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $loop = new WP_Query( array(
    'post_type' => 'ami',
    'posts_per_page' => 24,
    'orderby'=> 'id',
    'paged'=>$paged
    ) );

     do_action('kadence_page_title_container');
    ?>
    
    <div id="content" class="container">
        <div class="row">
            <div class="main <?php echo esc_attr(kadence_main_class()); ?>" id="ktmain" role="main">

    <div class="amis col-md-12">

    <?php
    echo $page->post_content;

    while ( $loop->have_posts() ) : $loop->the_post(); ?>
        <section id="ami-<?php echo $post->ID;?>" class="col-md-4 col-sm-4 col-xs-12 ami-post">
            <a href="<?php echo get_permalink(); ?>">
                <img src="<?php echo wp_get_attachment_url( get_post_thumbnail_id($post->ID) ); ?>" style="width:100%;height:150px;background-color:#1e1e1e;" />
                <div class="ami-title">
                <?php
                    echo '<h2 class="gal_title">'.$post->post_title.'</h2>';
                ?>
                </div>
            </a>
        </section>
    <?php endwhile; ?>
    </div>
                <?php 
                /**
                * @hooked virtue_page_comments - 20
                */
                do_action('kadence_page_footer');
                ?>
            </div><!-- /.main -->

Passons à présent au design de chaque contenu de type « ami ».

b/ Création d’un fichier de contenu pour custom post type

Si vous êtes sur un thème enfant, récupérez le fichier content-single.php, et placez-le en respectant bien l’arborescence du thème parent, dans le thème enfant.

Dans mon cas, le fichier se trouve dans le thème parent dans le répertoire /templates/content-single.php. Je le place donc dans mon thème enfant en créant un dossier /templates, et je renomme le fichier en content-ami (nom de mon custom post type).

En le modifiant vous pourrez ainsi modifier intégralement son design. En revanche, il va falloir préciser à WordPress que si le contenu est de type « ami », alors il va devoir traiter la demande différemment d’un article ou d’une page, en utilisant désormais et dans ce cas le fichier content-ami.php au lieu de content-single.php. Tout cela annonce très clairement une condition if en PHP.

Faites de même avec le fichier single.php, qui traite le contenu en-dehors des pages (par défaut donc, ce fichier affiche les articles) : copiez-le et collez-le dans votre thème enfant, toujours en respectant l’arborescence (ce point très important).

Editez ensuite content-ami.php et repérez la ligne suivante :

<?php get_template_part('templates/content', 'single'); ?>

Remplacez-la par ceci :

<?php
if ( is_post_type( 'ami' )) {
    get_template_part('templates/content', 'ami');
} else {
    get_template_part('templates/content', 'single');
}
?>

En bref, on demande à WordPress d’afficher un autre template si le contenu est « ami ». La fonction is_post_type n’existant pas sous WordPress (et c’est bien dommage 🙁 ), vous allez devoir l’ajouter dans le functions.php de votre thème enfant. La voici :

/**
 * Function get post type
 */
function is_post_type($type){
    global $wp_query;
    if($type == get_post_type($wp_query->post->ID)) return true;
    return false;
}

A présent vous pouvez enfin modifier content-ami.php de votre thème enfant pour y ajouter ce fameux lien dans un nouvel onglet, issu de la meta box.

Dans le fichier, vous n’avez plus qu’à placer cette fonction PHP de WordPress à l’emplacement de votre choix :

<p><a href="<?php echo get_post_meta( $post->ID, '_blank_link_key', true );?>"><?php echo get_post_meta( $post->ID, '_blank_link_key', true ); ?> </a></p>

Comme plus haut dans ma fonction de meta box, j’utilise get_post_meta pour récupérer la valeur de _blank_link_key associée à mon contenu (vous vous en souvenez ?)

Le tout est terminé, voici en image le résultat obtenu sur le site même où vous lisez ces lignes :

WordPress : créer des custom post types 5

Le contenu de mon functions.php est donc le suivant :

/***
 * Register a ami post type.
 *
 * @link http://codex.wordpress.org/Function_Reference/register_post_type
 */
function ami_init() {
  $labels = array(
    'name'               => _x( 'Amis', 'post type general name', 'virtue' ),
    'singular_name'      => _x( 'Ami', 'post type singular name', 'virtue' ),
    'menu_name'          => _x( 'Amis', 'admin menu', 'virtue' ),
    'name_admin_bar'     => _x( 'Ami', 'add new on admin bar', 'virtue' ),
    'add_new'            => _x( 'Ajouter', 'ami', 'virtue' ),
    'add_new_item'       => __( 'Ajouter un nouvel ami', 'virtue' ),
    'new_item'           => __( 'Nouvel ami', 'virtue' ),
    'edit_item'          => __( 'Editer ami', 'virtue' ),
    'view_item'          => __( 'Voir ami', 'virtue' ),
    'all_items'          => __( 'Tous les amis', 'virtue' ),
    'search_items'       => __( 'Rechercher amis', 'virtue' ),
    'parent_item_colon'  => __( 'Parent amis:', 'virtue' ),
    'not_found'          => __( 'Aucun ami trouvé.', 'virtue' ),
    'not_found_in_trash' => __( 'Aucun ami trouvé dans la corbeille.', 'virtue' )
  );

  $args = array(
    'labels'             => $labels,
    'description'        => __( 'Description.', 'virtue' ),
    'public'             => true,
    'publicly_queryable' => true,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'query_var'          => true,
    'rewrite'            => array( 'slug' => 'ami' ),
    'capability_type'    => 'post',
    'has_archive'        => true,
    'hierarchical'       => false,
    'menu_position'      => null,
    'supports'           => array( 'title', 'editor', 'thumbnail', 'page-attributes' )
  );

  register_post_type( 'ami', $args );
}

add_action( 'init', 'ami_init' );

register_taxonomy( 'catégories', 'ami', array( 'hierarchical' => true, 'label' => 'Catégories', 'query_var' => true, 'rewrite' => true ) );

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

//create two taxonomies, genres and tags for the post type "tag"
function create_tag_taxonomies() 
{
  // Add new taxonomy, NOT hierarchical (like tags)
  $labels = array(
    'name' => _x( 'Tags', 'taxonomy general name' ),
    'singular_name' => _x( 'Tag', 'taxonomy singular name' ),
    'search_items' =>  __( 'Search Tags' ),
    'popular_items' => __( 'Popular Tags' ),
    'all_items' => __( 'All Tags' ),
    'parent_item' => null,
    'parent_item_colon' => null,
    'edit_item' => __( 'Edit Tag' ), 
    'update_item' => __( 'Update Tag' ),
    'add_new_item' => __( 'Add New Tag' ),
    'new_item_name' => __( 'New Tag Name' ),
    'separate_items_with_commas' => __( 'Separate tags with commas' ),
    'add_or_remove_items' => __( 'Add or remove tags' ),
    'choose_from_most_used' => __( 'Choose from the most used tags' ),
    'menu_name' => __( 'Tags' ),
  ); 

  register_taxonomy('tag','ami',array(
    'hierarchical' => false,
    'labels' => $labels,
    'show_ui' => true,
    'update_count_callback' => '_update_post_term_count',
    'query_var' => true,
    'rewrite' => array( 'slug' => 'tag' ),
  ));
}

/***
 * Add boxe for custom url
 * http://codex.wordpress.org/Function_Reference/add_meta_box
 * Added by Cyril CHALAMON
**/
function customlink_add_meta_box() {

  $screens = array('ami');

  foreach ( $screens as $screen ) {

    add_meta_box(
      'customlink_sectionid',
      __( 'Ajout d\'un lien externe', 'virtue' ),
      'customlink_meta_box_callback',
      $screen
    );
  }
}
add_action( 'add_meta_boxes', 'customlink_add_meta_box' );

/***
 * Prints the box content.
 *
 * @param WP_Post $post The object for the current post/page.
 */
function customlink_meta_box_callback( $post ) {

  // Add a nonce field so we can check for it later.
  wp_nonce_field( 'customlink_save_meta_box_data', 'customlink_meta_box_nonce' );

  /**
   * Use get_post_meta() to retrieve an existing value
   * from the database and use the value for the form.
   */
  $value = get_post_meta( $post->ID, '_blank_link_key', true );

  echo '<label for="customlink_new_field">';
  _e( 'Merci de renseigner une URL complète', 'virtue' );
  echo '</label> ';
  echo '<input type="text" id="customlink_new_field" name="customlink_new_field" value="' . esc_attr( $value ) . '" size="100" />';
}

/***
 * When the post is saved, saves our custom data.
 * @param int $post_id The ID of the post being saved.
 */
function customlink_save_meta_box_data( $post_id ) {

  /**
   * We need to verify this came from our screen and with proper authorization,
   * because the save_post action can be triggered at other times.
   */

  // Check if our nonce is set.
  if ( ! isset( $_POST['customlink_meta_box_nonce'] ) ) {
    return;
  }

  // Verify that the nonce is valid.
  if ( ! wp_verify_nonce( $_POST['customlink_meta_box_nonce'], 'customlink_save_meta_box_data' ) ) {
    return;
  }

  // If this is an autosave, our form has not been submitted, so we don't want to do anything.
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
    return;
  }

  // Check the user's permissions.
  if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) {

    if ( ! current_user_can( 'edit_page', $post_id ) ) {
      return;
    }

  } else {

    if ( ! current_user_can( 'edit_post', $post_id ) ) {
      return;
    }
  }

  /** OK, it's safe for us to save the data now. */

  // Make sure that it is set.
  if ( ! isset( $_POST['customlink_new_field'] ) ) {
    return;
  }

  // Sanitize user input.
  $my_data = sanitize_text_field( $_POST['customlink_new_field'] );

  // Update the meta field in the database.
  update_post_meta( $post_id, '_blank_link_key', $my_data );
}
add_action( 'save_post', 'customlink_save_meta_box_data' );


/**
 * Function get post type
 */
function is_post_type($type){
    global $wp_query;
    if($type == get_post_type($wp_query->post->ID)) return true;
    return false;
}

Le tout est plutôt long à bien cerner, pensez à respecter l’arborescence des fichiers du thème parent. Servez-vous sans relâche du Codex de WordPress qui est votre référence ultime pour avancer sur ce genre de choses. Prenez votre temps et à terme vous réaliserez que ce genre de modifications est très rapide à mettre en place quand vous disposez du code (comme ici hein ?  🙂 )

Sources :

https://wordpress.org/support/article/post-types/

https://codex.wordpress.org/Function_Reference/register_taxonomy

Imprimer Imprimer
Suivre Cyssoo:

Développeur - formateur

Je cherche à display errors le monde, vous auriez pas la doc' ? Follow me on Twitter !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.