8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je suis débutant en Wordpress, et dans mon template, j'utilise ACF pour donner un choix à mes utilisateurs avec le custom-field "target" qui peut avoir les valeur "primary, middle et high".

J'aimerais pouvoir filtrer mes articles dans une page d'archive avec l'url de la valeur, comme ça : "monurl.fr/primary/" qui me montrerait les posts ayant la valeur "primary" pour "target".

Est-ce possible ou je m'y prends mal ?
Quel nom doit avoir le fichier ? archive-primary.php ou archive.php?target=primary ?

Help Smiley smile
Le plus simple c'est de faire une taxonomie (des catégories) pour cela.

Autrement tu peux effectivement partir d'un custom field mais il faudra ensuite passer un paramètre en plus dans l'url de la page d'archive (il y a une mécanique prévue pour cela dans wordpress) puis modifier la requête avec query_posts ou avec un hook quelconque depuis functions.php.
J'ai trouvé une solution Smiley smile

1- Je crée les catégories qui correspondent : primary, middle et high

2- Dans functions.php je crée une "action" qui va automatiquement mettre les custom_fields de mon target en catégories :

//  https://wordpress.stackexchange.com/questions/269815/assign-category-using-custom-field
 
// Add an action to run on post save
add_action( 'save_post', 'set_target_cat_on_save' );
function set_target_cat_on_save( $post_id ){
    // On teste si le post n'es pas mis à la poubelle pour ne pas lancer le script lors de la mise à la poubelle
    if ( 'trash' != get_post_status( $post_id ) ) {
            // On initialise un array/tableau vide
            $current_terms_array = [];
            // on récupère les catégories de l'article de façon brute
            $current_terms_array_raw = get_the_category( $post_id );
            // On sort les noms des catégories pour les avoir dans un tableau/array
            foreach ( $current_terms_array_raw as $cd ) { $cat_name = $cd->cat_name; $current_terms_array[] = $cat_name; }
            // On liste les target
            $terms_target_array = array("primary","middle","high");
            // On va enlever les termes cibles s'ils sont présent dans les catégories de l'article (pour réinitialiser)
            $result = array_diff( $current_terms_array, $terms_target_array );
            // On récupère la valeur de cible du post
            $target_valeur = get_field( "target", $post_id );
            // On le rajoute dans la liste des catégories
            array_push( $result, $target_valeur['value'] );
            // On reset la liste des catégories du post avec le nouveau tableau/array
            wp_set_object_terms( $post_id, $result, 'category' );
        }
    }



3- Dans les meta-box (backend) des articles/posts je cache ces catégories, pour ne pas être redondant :



function hide_cat(){
    // On va cacher non-classé:1, primary:137, middle:138, hight:139
    echo "<style type='text/css'>
          li#category-1 { display:none; }
          li#category-137 { display:none; }
          li#category-138 { display:none; }
          li#category-139 { display:none; }
          </style>";
          }
add_action( "admin_head-post.php", "hide_cat" );
add_action( "admin_head-post-new.php", "hide_cat" );