WordPress 4 min de lecture

Créer un CPT WordPress pour des réalisations avec ACF et SEO propre

#wordpress#acf#seo

Créez un type de contenu WordPress pour présenter des réalisations client: champs ACF, archive, template détail, maillage interne et SEO propre.

Créer un CPT WordPress pour des réalisations avec ACF et SEO propre

Une page "Réalisations" écrite à la main suffit pour deux projets. Dès que le portfolio grandit, il vaut mieux structurer les réalisations dans un Custom Post Type WordPress.

Ce tutoriel montre comment créer un CPT realisations, ajouter des champs ACF utiles et préparer des templates propres pour l'archive et les pages détail.

Objectif

Nous allons créer:

  • un CPT pour les réalisations;
  • des champs ACF pour le contexte projet;
  • une archive lisible;
  • une page détail SEO-friendly;
  • un maillage vers les services.

L'exemple s'applique à un freelance, une agence, un studio ou un site corporate.

Déclarer le CPT

Dans un plugin métier ou dans votre thème:

add_action('init', function () {
    register_post_type('realisation', [
        'labels' => [
            'name' => 'Réalisations',
            'singular_name' => 'Réalisation',
            'add_new_item' => 'Ajouter une réalisation',
            'edit_item' => 'Modifier la réalisation',
        ],
        'public' => true,
        'has_archive' => true,
        'rewrite' => ['slug' => 'realisations'],
        'menu_icon' => 'dashicons-portfolio',
        'supports' => ['title', 'editor', 'thumbnail', 'excerpt'],
        'show_in_rest' => true,
    ]);
});

Après ajout, enregistrez les permaliens dans l'administration.

Ajouter les champs ACF

Champs utiles:

  • project_client_type: type de client;
  • project_stack: technologies;
  • project_services: services réalisés;
  • project_url: lien public;
  • project_year: année;
  • project_result: résultat ou bénéfice;
  • project_is_confidential: confidentialité.

Exemple de déclaration PHP:

add_action('acf/init', function () {
    acf_add_local_field_group([
        'key' => 'group_realisation_details',
        'title' => 'Détails de la réalisation',
        'fields' => [
            [
                'key' => 'field_project_stack',
                'label' => 'Stack technique',
                'name' => 'project_stack',
                'type' => 'text',
            ],
            [
                'key' => 'field_project_result',
                'label' => 'Résultat',
                'name' => 'project_result',
                'type' => 'textarea',
                'rows' => 3,
            ],
            [
                'key' => 'field_project_confidential',
                'label' => 'Projet confidentiel',
                'name' => 'project_is_confidential',
                'type' => 'true_false',
                'ui' => 1,
            ],
        ],
        'location' => [[[
            'param' => 'post_type',
            'operator' => '==',
            'value' => 'realisation',
        ]]],
    ]);
});

Si certaines réalisations sont confidentielles, prévoyez ce cas dès le modèle de contenu.

Template archive

Créez archive-realisation.php:

<?php get_header(); ?>

<main class="realisations-archive">
    <header>
        <p>Réalisations</p>
        <h1>Projets web réalisés</h1>
        <p>Applications métier, sites WordPress, e-commerce et maintenance.</p>
    </header>

    <?php if (have_posts()) : ?>
        <div class="realisations-grid">
            <?php while (have_posts()) : the_post(); ?>
                <article>
                    <?php if (has_post_thumbnail()) : ?>
                        <a href="<?php the_permalink(); ?>">
                            <?php the_post_thumbnail('large'); ?>
                        </a>
                    <?php endif; ?>

                    <h2>
                        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                    </h2>

                    <?php if ($stack = get_field('project_stack')) : ?>
                        <p><?php echo esc_html($stack); ?></p>
                    <?php endif; ?>

                    <?php the_excerpt(); ?>
                </article>
            <?php endwhile; ?>
        </div>
    <?php endif; ?>
</main>

<?php get_footer(); ?>

L'archive doit donner envie de cliquer, mais rester lisible. Évitez les cartes trop longues.

Template détail

Créez single-realisation.php:

<?php get_header(); ?>

<main class="realisation-single">
    <?php while (have_posts()) : the_post(); ?>
        <?php
        $stack = get_field('project_stack');
        $result = get_field('project_result');
        $confidential = get_field('project_is_confidential');
        ?>

        <article>
            <p>Réalisation</p>
            <h1><?php the_title(); ?></h1>

            <?php if ($stack) : ?>
                <p><strong>Stack:</strong> <?php echo esc_html($stack); ?></p>
            <?php endif; ?>

            <?php the_content(); ?>

            <?php if ($result) : ?>
                <section>
                    <h2>Résultat</h2>
                    <p><?php echo esc_html($result); ?></p>
                </section>
            <?php endif; ?>

            <?php if ($confidential) : ?>
                <p>Certains détails ont été anonymisés pour respecter la confidentialité du projet.</p>
            <?php endif; ?>
        </article>
    <?php endwhile; ?>
</main>

<?php get_footer(); ?>

La confidentialité ne doit pas empêcher de montrer l'expertise. On peut parler de contexte, stack, contraintes et méthode sans divulguer de données client.

Maillage interne

Chaque réalisation doit pointer vers les services liés:

<p>
    Besoin d'un projet similaire?
    <a href="/services/maintenance-wordpress/">Maintenance WordPress</a>
    ou
    <a href="/services/application-laravel/">application Laravel sur mesure</a>.
</p>

Le maillage aide l'utilisateur et renforce les pages business.

SEO

Bonnes pratiques:

  • title unique par réalisation;
  • excerpt rempli;
  • image avec alt descriptif;
  • canonical propre;
  • archive indexable;
  • pas de faux avis ou fausses références;
  • données anonymisées si nécessaire.

Une réalisation bien structurée peut se positionner sur des requêtes longues: "site WordPress espace presse", "backoffice e-commerce Laravel", "application métier Laravel".

Conclusion

Un CPT realisation transforme un portfolio en vrai actif SEO. Les projets deviennent filtrables, reliés aux services et maintenables dans le temps.

Avec ACF, vous gardez une interface simple pour l'équipe, tout en donnant au thème des données propres à afficher.