Bonjour,

Je souhaiterai détecter le slug de la catégorie technologie passé dans l’url pour pour ajouter à un endroit une classe css et mettre en forme certains éléments des pages enfants (dans cet exemple, sur la page bluetooth, patati, patata, ...).

Voici le type d’url que j’ai:
https://monsiteweb.be/technologie/bluetooth/
https://monsiteweb.be/technologie/patati/
https://monsiteweb.be/technologie/patata/

De cette façon, j'obtiens le slug de la page en cours

$page_slug = get_post_field( 'post_name', $post_id );

Mais comment faire pour détecter le parent ?

Merci.

4 réponses


LuciferX
Auteur

Il s'agit d'un custom post type et je n'arrive pas à faire ce que je voudrais,
Est-ce que quelqu'un aurait un exemple fonctionnel ?

Voici à quoi ressemble mes custom post type repris dans fonction.php

/* ================================
 Création de du custom post type technologies
================================ */
function wpm_custom_post_type() {

    // On rentre les différentes dénominations de notre custom post type qui seront affichées dans l'administration
    $labels = array(
        // Le nom au pluriel
        'name'                => _x( 'Technologies', 'Post Type General Name'),
        // Le nom au singulier
        'singular_name'       => _x( 'Technologie', 'Post Type Singular Name'),
        // Le libellé affiché dans le menu
        'menu_name'           => __( 'Technologies'),
        // Les différents libellés de l'administration
        'all_items'           => __( 'Toutes les technologies'),
        'view_item'           => __( 'Voir les technologies'),
        'add_new_item'        => __( 'Ajouter une nouvelle technologie'),
        'add_new'             => __( 'Ajouter'),
        'edit_item'           => __( 'Editer la technologie'),
        'update_item'         => __( 'Modifier la technologie'),
        'search_items'        => __( 'Rechercher une technologie'),
        'not_found'           => __( 'Non trouvée'),
        'not_found_in_trash'  => __( 'Non trouvée dans la corbeille'),
    );

    // On peut définir ici d'autres options pour notre custom post type

    $args = array(
        'label'               => __( 'Technologies'),
        'description'         => __( 'Tous sur technologies'),
        'labels'              => $labels,
        // Si vous utilisez les Dashicons, mettez la classe CSS de celui que vous souhaitez
        'menu_icon'      => 'dashicons-awards',
        // On définit les options disponibles dans l'éditeur de notre custom post type ( un titre, un auteur...)
        'supports'            => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields', ),
        /* 
        * Différentes options supplémentaires
        */
        'show_in_rest' => true,
        'hierarchical'        => false,
        'public'              => true,
        'has_archive'         => true,
        'rewrite'             => array( 'slug' => 'technologie'),

    );

    // On enregistre notre custom post type qu'on nomme ici "technologies" et ses arguments
    register_post_type( 'technologies', $args );

}

add_action( 'init', 'wpm_custom_post_type', 0 );
add_action( 'init', 'wpm_add_taxonomies', 0 );

//On crée 3 taxonomies personnalisées: Date de création, Fabriquant et Catégories de technologie.

/* ================================
 création de nos taxonomies personnalisées
================================ */
function wpm_add_taxonomies() {

    // Taxonomie Date de création

    // On déclare ici les différentes dénominations de notre taxonomie qui seront affichées et utilisées dans l'administration de WordPress
    $labels_date = array(
        'name'                          => _x( 'Date de création', 'taxonomy general name'),
        'singular_name'                 => _x( 'Date de création', 'taxonomy singular name'),
        'search_items'                  => __( 'Chercher une date de création'),
        'all_items'                     => __( 'Toutes les dates de création'),
        'edit_item'                     => __( 'Editer la date de création'),
        'update_item'                   => __( 'Mettre à jour la date de création'),
        'add_new_item'                  => __( 'Ajouter une nouvelle date de création'),
        'new_item_name'                 => __( 'Valeur de la nouvelle date de création'),
        'separate_items_with_commas'    => __( 'Séparer les dates de création avec une virgule'),
        'add_or_remove_items'           => __( 'Ajouter ou supprimer une date de création'),
        'menu_name'                     => __( 'Date de création'),
    );

    $args_date = array(
    // Si 'hierarchical' est défini à false, notre taxonomie se comportera comme une étiquette standard
        'hierarchical'      => false,
        'labels'            => $labels_date,
        'show_ui'           => true,
        'show_in_rest'      => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array( 'slug' => 'date-de-creation' ),
    );

    register_taxonomy( 'date', 'technologies', $args_date );
    register_post_type( 'date', $args );

    // Taxonomie Fabriquant

    $labels_fabriquants = array(
        'name'                       => _x( 'Fabriquants', 'taxonomy general name'),
        'singular_name'              => _x( 'Fabriquant', 'taxonomy singular name'),
        'search_items'               => __( 'Rechercher un fabriquant'),
        'popular_items'              => __( 'Fabriquants populaires'),
        'all_items'                  => __( 'Tous les fabriquants'),
        'edit_item'                  => __( 'Editer un fabriquant'),
        'update_item'                => __( 'Mettre à jour un fabriquant'),
        'add_new_item'               => __( 'Ajouter un nouveau fabriquant'),
        'new_item_name'              => __( 'Nom du nouveau fabriquant'),
        'separate_items_with_commas' => __( 'Séparer les fabriquants avec une virgule'),
        'add_or_remove_items'        => __( 'Ajouter ou supprimer un fabriquant'),
        'choose_from_most_used'      => __( 'Choisir parmi les plus utilisés'),
        'not_found'                  => __( 'Pas de fabriquants trouvés'),
        'menu_name'                  => __( 'Fabriquants'),
    );

    $args_fabriquants = array(
        'hierarchical'          => true,
        'labels'                => $labels_fabriquants,
        'show_ui'               => true,
        'show_in_rest'          => true,
        'show_admin_column'     => true,
        'update_count_callback' => '_update_post_term_count',
        'query_var'             => true,
        'rewrite'               => array( 'slug' => 'fabriquants' ),
    );

    register_taxonomy( 'fabriquants', 'technologies', $args_fabriquants );
    register_post_type( 'fabriquants', $args );

    // Catégorie de technologie

    $labels_cat_technologie = array(
        'name'                       => _x( 'Catégories de technologie', 'taxonomy general name'),
        'singular_name'              => _x( 'Catégories de technologie', '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égories de technologie'),
    );

    $args_cat_technologie = array(
    // Si 'hierarchical' est défini à true, notre taxonomie se comportera comme une catégorie standard
        'hierarchical'          => true,
        'labels'                => $labels_cat_technologie,
        'show_ui'               => true,
        'show_in_rest'          => true,
        'show_admin_column'     => true,
        'update_count_callback' => '_update_post_term_count',
        'query_var'             => true,
        'rewrite'               => array( 'slug' => 'categories-technologies' ),
    );

    register_taxonomy( 'categoriestechnologies', 'technologies', $args_cat_technologie );
    register_post_type( 'categoriestechnologies', $args );
}

// Miniature associée
add_image_size( 'techno_img', 200, 200, true );

Le code de ma page single-technologies.php

    <div id="techno_container">
        <input id="tab1" type="radio" name="tabs" checked>
        <label for="tab1"><i class="fa fa-question-circle-o"></i><span>C'est quoi <?php the_title(); ?> ?</span></label>
        <input id="tab2" type="radio" name="tabs">
        <label for="tab2"><i class="fa fa-cart-plus"></i><span>Produits associés</span></label>
        <section id="content1" class="tab-content">
        <?php
            while ( have_posts() ) : the_post();
            do_action( 'electro_single_post_before' );
            // contenu
            the_content();
            do_action( 'electro_single_post_after' );
            endwhile; // end of the loop.
        ?>
        </section>
        <section id="content2" class="tab-content">
            test
        </section>
    </div>

Et le code de ma page archives.php

<div class="archives_techno">
    <h1>Technologies :</h1>
    <ul id="filters" class="clearfix">
    <li><span class="filter active" data-filter="<?php $buffer = ''; foreach ($categories as $categorie) {$buffer .= '.' . strtolower($categorie->name) . ',';} echo rtrim($buffer, ','); ?>">Toutes</span></li>
    <?php foreach ($categories as $categorie) { ?>
    <li><span class="filter" data-filter=".<?php echo strtolower($categorie->name); ?>"><?php echo $categorie->name; ?></span></li>
    <?php } ?>
    </ul>
    <div class="clear"></div>
    <div id="portfoliolist">
        <?php while ( have_posts() ) : the_post(); ?>
        <div class="portfolio <?php 
            $terms = get_the_terms($post->ID, 'categoriestechnologies' );
            if ($terms && ! is_wp_error($terms)) :
                $tslugs_arr = array();
                foreach ($terms as $term) {
                    $tslugs_arr[] = $term->slug;
                }
                $terms_slug_str = join( " ", $tslugs_arr);
            endif;
            echo $terms_slug_str;
            ?>" data-cat="<?php 
            $terms = get_the_terms($post->ID, 'categoriestechnologies' );
            if ($terms && ! is_wp_error($terms)) :
                $tslugs_arr = array();
                foreach ($terms as $term) {
                    $tslugs_arr[] = $term->slug;
                }
                $terms_slug_str = join( " ", $tslugs_arr);
            endif;
            echo $terms_slug_str;
        ?>">    
            <figure class="effet"><?php the_post_thumbnail("thumbnail", array("class" => "test")); ?>
                <figcaption>
                    <h2><?php the_title(); ?></h2>
                    <p></p>
                </figcaption><a href="<?php the_permalink(); ?>"></a>
            </figure>
            <div class="categ">
            <?php 
               $terms = get_the_terms($post->ID, 'categoriestechnologies' );
                if ($terms && ! is_wp_error($terms)) :
                    $tslugs_arr = array();
                    foreach ($terms as $term) {
                        $tslugs_arr[] = $term->slug;
                    }
                    $terms_slug_str = join( " ", $tslugs_arr);
                endif;
                echo $terms_slug_str;
            ?>
            </div>
        </div>
    <?php endwhile; ?>
    </div>
</div>

Par avance, un tout grand merci.

Bonjour,

Sincèremenent si je devais reprendre tous ton code j'en aurais pour des heures. Par contre tu peux essayé le fonction PHP strpos ( string position) pour récupérer ton slug parent de ta catégorie.

Exemple

$page_slug = get_post_field( 'post_name', $post_id );
if(get_the_category('technologie')) {
        $slug = strpos(get_the_category('technologie')  . /, $page_slug);
            if ($slug.find('/')) {
                $slug = explode('/', $slug);
               foreach ( slug as $value) {
               if ( $value != '/' )
                    $slug = $value;
              }
        }
}

J'ai écris de tête le code hors vc mais tu peux partir ce type de condition en gérant dans ta condition les sous catégorie.

Bon courage.

LuciferX
Auteur

Merci, je vais voir ce que je peux faire ;-)