Décidement ACF Relation, c’est pas facile (Créer un compte)

  • WordPress :5.8
  • Statut : non résolu
9 sujets de 1 à 9 (sur un total de 9)
  • Auteur
    Messages
  • #2385139
    jmir38
    Participant
    Initié WordPress
    11 contributions

    Bonjour,

    Mon champ relation nommé “listevar” de ACF dans la base de données est sous cette forme :
    a:4:{i:0;s:3:”452″;i:1;s:3:”453″;i:2;s:3:”450″;i:3;s:3:”548″;}

    Je souhaite pour ces données depuis un plugins
    – les récupérer
    – les trier
    – les réenregistrer
    de manière a avoir cela
    a:4:{i:0;s:3:”453″;i:1;s:3:”450″;i:2;s:3:”452″;i:3;s:3:”548″;}

    Les récupérer ça fonctionne
    – soit => $mesvarietes = get_field(‘listevar’); => print_r envoi le contenu de chaque champs de chaque variété
    – soit => $mesvarietes = get_post_meta($post->ID, ‘listevar’, true); => plus simple le print_r donne : Array ( [0] => 452 [1] => 453 [2] => 450 [3] => 548 )

    Les trier ça fonctionne aussi

    Mais je trouve pas comment enregistrer les nouvelles valeurs dans le champs
    ou vu sous un autre angle comment transformer le tableau
    [0] => 452 [1] => 453 [2] => 450 [3] => 548
    en
    a:4:{i:0;s:3:”452″;i:1;s:3:”453″;i:2;s:3:”450″;i:3;s:3:”548″;}
    (je ne sais comment ça s’appelle cette forme et comment cela se gère)

    Merci si possible de m’éclairer un peu !

    #2385142
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    Hello 🙂

    tout simplement, comme tu as un tableau trié que tu as du stocker dans une variable, tu fais un update_meta. Le a:4 etc. est simplement la “sérialisation” effectuée par WP pour enregistrer un tableau dans un champ texte, puisque meta_value est toujours un champs texte. (tu peux regarder les fonctions php serialize, et la fonction wordpress maybe_unserialize que je trouve très poétique 😀  )

    Donc

    if (function_exists('acf_update_meta') ) {  // ça c'est pour ne pas faire une erreur si acf n'est pas activé
    
    $postid= $post->ID ; 
    
    $mes_varietes = get_field('list_var', $postid) ; 
    
    asort($mes_varietes) ; 
    
    update_field('list_var', $mes_varietes, $postid );
    
    }

    #2385144
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    Sinon, bien que je sois une très grande fan d’ACF, pour le relationnel, je préfère post 2 post de scribu, qu’on peut trouver sur github. Il faut coder mais les tutos sont très simples, et tu as, amha, beaucoup plus de souplesse que dans ACF Relation. En particulier tu peux faire des relations réciproques automatiquement, même en en ayant plusieurs, ce qui n’est pas possible avec ACF (pour que ça marche, le champ relation ne doit pas être un sous champ dans un répéteur, entre autres).

    Post 2 post n’est pas mis à jour depuis longtemps, mais il fonctionne parfaitement.

    #2385184
    jmir38
    Participant
    Initié WordPress
    11 contributions

    Bonjour et merci pour votre soutien

    c’est un peu compliqué pour moi avec ACF
    je testerai d’autres solutions quand j’aurai compris le fonctionnement des plugins et de leurs mise en forme

    en fin de compte j’affiche les variétés après les avoir triées
    Plus tard, Je souhaite pour chaque variété pouvoir leurs ajouter des informations personnalisées

    Le asort simple ne fonctionnait pas il me semble, remplacé par array_multisort

    Tout fonctionne sauf la sauvegarde, cette manip supprime le champs relation ACF “listevar”

    voici mon code

    //=========================================================================
    //  meta boxes variete
    //=========================================================================
    function ajouter_variete_verger_meta_box() {
    	add_meta_box('variete_verger', 'Gestion de vos variétés ', 'variete_verger_construction', 'verger', 'normal', 'high');
    
    }
    
    //=========================================================================
    // affichage des varietes
    //=========================================================================
    
    function variete_verger_construction($post) {
        
        $postid= $post->ID ; 
        $mesvarietes = get_field('listevar', $postid);
    
        if($mesvarietes) {  
            print_r($mesvarietes);
            $columns = array_column($mesvarietes, 'post_title');
            array_multisort($columns, SORT_ASC, $mesvarietes);
            ?>
            <ul>
                <?php foreach( $mesvarietes as $mavariete ): ?>
                      <li><p>variete : <?php  echo $mavariete->post_title; ?></p></li>
                <?php endforeach; ?>
            </ul>
            <?php
            print_r($mesvarietes);
        }   
     
        
    } 
    add_action ('add_meta_boxes', 'ajouter_variete_verger_meta_box');
    
    
    //=========================================================================
    //sauvegarde variete pour verger
    //=========================================================================
    function variete_verger_enregistrer($post_id) {
    	
        if($mesvarietes) {  
            update_field('listevar', $mes_varietes, $postid );
        }
    }
    add_action ('ACF/save_post', 'variete_verger_enregistrer', 20);
    plugins verger

    • Cette réponse a été modifiée le il y a 1 jour et 2 heures par jmir38.
    #2385198
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    Il serait possible que la sauvegarde ne fonctionne pas parce qu’il y a $post_id et $postid 😀 et surtout parce que la variable $mes_varietes n’est pas définie à l’intérieur de la fonction 🙂

    #2385240
    jmir38
    Participant
    Initié WordPress
    11 contributions

    Merci pour vos réponses

    Oui, en effet, c’est mon premier plugins  !
    Maintenant a l’enregistrement, j’ai une erreur : La mise à jour a échoué.

    je ne sais pas si c’est normal
    Mais est il possible que le résultat du get_field ci dessous (paragraphe 2)
    se transforme automatiquement en code serialisé ci dessous (paragraphe 1)

    1. le code sérialisé de meta_value listevar
      a:2:{i:0;s:3:”548″;i:1;s:3:”453″;}
    2.  print_r($mesvarietes); (résultat du get_field après le trie)
      Array ( [0] => WP_Post Object ( [ID] => 453 [post_author] => 1 [post_date] => 2021-08-21 07:33:54 [post_date_gmt] => 2021-08-21 05:33:54 [post_content] => [post_title] => Atlas [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => atlas [to_ping] => [pinged] => [post_modified] => 2021-09-12 22:37:15 [post_modified_gmt] => 2021-09-12 20:37:15 [post_content_filtered] => [post_parent] => 0 [guid] =>  [menu_order] => 0 [post_type] => variete [post_mime_type] => [comment_count] => 0 [filter] => raw ) [1] => WP_Post Object ( [ID] => 548 [post_author] => 1 [post_date] => 2021-09-12 15:13:39 [post_date_gmt] => 2021-09-12 13:13:39 [post_content] => template par default titre 1 titre 2 contenu [post_title] => pomme [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => pomme [to_ping] => [pinged] => [post_modified] => 2021-09-12 15:13:41 [post_modified_gmt] => 2021-09-12 13:13:41 [post_content_filtered] => [post_parent] => 0 [guid] =>  [menu_order] => 0 [post_type] => variete [post_mime_type] => [comment_count] => 0 [filter] => raw ) )
    • Cette réponse a été modifiée le il y a 19 heures et 16 minutes par jmir38.
    #2385241
    jmir38
    Participant
    Initié WordPress
    11 contributions

    Et aussi le code du plugin revisité

    
    //=========================================================================
    //  meta boxes variete
    //=========================================================================
    function ajouter_variete_verger_meta_box() {
    	add_meta_box('variete_verger', 'Gestion de vos variétés ', 'variete_verger_construction', 'verger', 'normal', 'high');
    }
    
    //=========================================================================
    // affichage des varietes
    //=========================================================================
    
    function variete_verger_construction($mesvarietes) {
        $mesvarietes = variete_verger_trier($mesvarietes);
        if($mesvarietes) {  
            ?>
            <ul>
                <?php foreach( $mesvarietes as $mavariete ): ?>
                      <li><p>variete : <?php  echo $mavariete->post_title; ?></p></li>
                <?php endforeach; ?>
            </ul>
            <?php
    
        }   
    } 
    add_action ('add_meta_boxes', 'ajouter_variete_verger_meta_box');
    
    //=========================================================================
    //trier les varietes
    //=========================================================================
    function variete_verger_trier($post) {
        $postid = $post->ID ; 
        $mesvarietes = get_field('listevar', $postid);
        if($mesvarietes) {  
            $columns = array_column($mesvarietes, 'post_title');
            array_multisort($columns, SORT_ASC, $mesvarietes);
            print_r($mesvarietes);
            return $mesvarietes;
        }
    } 
    //=========================================================================
    //sauvegarde variete pour verger
    //=========================================================================
    function variete_verger_enregistrer($postid, $mesvarietes) {
        $mesvarietes = variete_verger_trier($mesvarietes);
        if($mesvarietes) {  
            update_field('listevar', $mesvarietes, $postid );
        }
    }
    add_action ('save_post', 'variete_verger_enregistrer');

    #2385246
    Lumiere de Lune
    Participant
    Maître WordPress
    19538 contributions

    Le print_r est en trop 😀
    Par ailleurs, tes variables ne sont pas cohérentes, tu fais toujours appel à des variables externes, qui ne sont pas définies dans les fonctions, et nulle part il n’y a le “get_field” ta fonction variete_verger_trier fait appel au $postid et tu lui donne comme variable $mesvarietes, que tu redéfinis alors que ça doit être un argument de la fonction.
    Je suis un peu perdue…

    1- si tu travailles avec ACF et un champ relation, tu n’as pas besoin de la première fonction de définition de la metabox ajouter_variete_verger_meta_box() c’est ACF qui s’en charge.

    2- l’affichage des variétés, normalement, pour moi ça se fait dans un template du thème, mais bon tu as peut être l’utilité de cette fonction.

    3- la fonction de tri des variables, pourquoi pas, mais pas avec la variable $post (regarde la tête qu’elle a, en plus c’est une variable globale de WP ^^). Au lieu de la mettre en argument de ta fonction, qui peut conduire à des problèmes, tu mets au tout début de ta fonction global $post (mais tu va avoir un problème si pour une raison ou une autre, comme la création d’un post dans l’admin, elle est appelée en dehors de la boucle :D)

    4- Ensuite pour mettre à jour ton champs, tu dois sortir un tableau qui a exactement la même structure que la valeur originelle, une array avec les ids de posts.

    Par rapport à ta demande originelle, tu viens d’introduire un truc qui change tout, qui est de trier sur le titre des posts 🙂

    #2385252
    jmir38
    Participant
    Initié WordPress
    11 contributions

    Je réponds pour le moment au principe de fonctionnement

    Pour la partie admin du verger : voir image jointe
    1) En bas : partie verger
    Ajout et retrait de plante de mon verger
    C’est la partie ACF => gestion de la relation entre
    – a gauche la liste des variétés
    – a droite les variétés que je déclare dans mon verger

    Dans l’exemple mon verger se compose de pomme puis atlas
    Cela fonctionne bien

    2) Trier => Partie centrale : gestion de vos variétés
    le but est de trier automatiquement par ordre alphabétique les variétés de mon verger
    c’est la partie plugins
    cela fonctionne bien  au niveau de l’affichage
    le tri est bon => atlas puis pomme

    C’est l’enregistrement qui pose problème

    3) personnaliser => Partie centrale : gestion de vos variétés
    A voir plus tard
    je ne sais pas si c’est possible par ce biais
    mais pour chaque plante de mon verger
    je souhaiterai ajouter des informations personnalisés

    Voila pour le fonctionnement
    Si nécessaire, je peux proposer un lien vers ce qui fonctionne déjà

    Merci pour votre aide

    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
9 sujets de 1 à 9 (sur un total de 9)
  • Vous devez être connecté pour répondre à ce sujet.