[Résolu] Besoin de précisions sur wp_update_post & save_post (Créer un compte)

  • WordPress :4.6.1
  • Statut : résolu
6 sujets de 1 à 6 (sur un total de 6)
  • Auteur
    Messages
  • #1573006
    Mooks
    Participant
    Padawan WordPress
    87 contributions

    Bonjour,

    Ma configuration WP actuelle

    • Version de PHP/MySQL : 7.0.7
    • Thème utilisé : custom
    • Extensions en place : plusieurs
    • Nom de l’hébergeur : Infomaniak
    • Adresse du site : https://www.les-alternatives.com

    Problème(s) rencontré(s) :

    Bonjour,

    J’aurais besoin de précisions concernant save_post (et accessoirement wp_update_post), vu qu’un hook que j’ai créer fonctionne de manière étrange.

    Le code ci-dessous me permet à définir automatiquement le bon terme d’une des taxonomies de mon post à la sauvegarde de celui-ci, et en fonction du premier mot du titre :

    /************************************************/
    /* Automatically assign Fiche/News/Forum/Vidéos */
    /************************************************/

    function auto_assign_custom_type_terms( $post_id ) {

    global $post;
    $first_word = current(explode(' ', get_the_title()));
    $first_word_without_maj = strtolower($first_word);

    if( $first_word_without_maj == 'news' ) {
    wp_set_object_terms( $post_id, null, 'custom-type' );
    wp_set_object_terms( $post_id, 'news', 'custom-type', true );

    } elseif ( $first_word_without_maj == 'forum' ) {
    wp_set_object_terms( $post_id, null, 'custom-type' );
    wp_set_object_terms( $post_id, 'forum', 'custom-type', true );

    } elseif ( $first_word_without_maj == 'videos' ) {
    wp_set_object_terms( $post_id, null, 'custom-type' );
    wp_set_object_terms( $post_id, 'videos', 'custom-type', true );

    } else {
    wp_set_object_terms( $post_id, null, 'custom-type' );
    wp_set_object_terms( $post_id, 'fiche', 'custom-type', true );
    }

    }

    add_action( 'save_post', 'auto_assign_custom_type_terms', 10, 3 );

    Le problème est que je dois, dans 80% des cas, sauvegarder deux fois l’article pour qu’il opère finalement au changement de terme. C’est pourquoi j’aurais besoin de vos lumières sur cet étrange phénomène. Dois-je plonger du côté wp_update_post plutôt que de save_post? Ou peut-être une combinaison des deux?

    #1573056
    Benzouye
    Participant
    Maître WordPress
    577 contributions

    Bonjour,

    Ton code ne fonctionne pas à cause de la variable globale $post … sans trop savoir pourquoi …

    En l’optimisant un peu cela fonctionne :

    function auto_assign_custom_type_terms( $post_id ) {
    // On reset les termes de cette taxinomie
    wp_set_object_terms( $post_id, null, 'custom-type' );

    // On formate le premier mot du titre
    $first_word = current(explode(' ', get_the_title( $post_id )));
    $first_word_without_maj = strtolower($first_word);

    // Valeur par défaut du terme
    $tax_slug = 'fiche';

    // On teste le premier mot
    switch( $first_word_without_maj ) {
    case 'news':
    $tax_slug = $first_word_without_maj;
    break;
    case 'forum':
    $tax_slug = $first_word_without_maj;
    break;
    case 'videos':
    $tax_slug = $first_word_without_maj;
    break;
    }

    // On ajoute le terme
    wp_set_object_terms( $post_id, $tax_slug, 'custom-type', true );
    }
    add_action( 'save_post', 'auto_assign_custom_type_terms', 10, 3 );

     

    #1573097
    Mooks
    Participant
    Padawan WordPress
    87 contributions

    Merci Benzouye, ton code marche au poil 😉

    #1573098
    Benzouye
    Participant
    Maître WordPress
    577 contributions

    Sujet résolu ? Bouton en haut à gauche du sujet 😉

    #1573102
    Mooks
    Participant
    Padawan WordPress
    87 contributions

    Yep, je voulais le faire, mais je me laisse toujours quelques temps avant de le faire en cas d’hypothétiques questions/problèmes qui surviendrais.

    #1573126
    Mooks
    Participant
    Padawan WordPress
    87 contributions

    Une petite contribution supplémentaire (si jamais quelqu’un planche sur le même genre de question, ca pourra toujours servir) : le précédent code ne prenait pas en compte les accents dans le formatage du premier mot du titre. C’est chose faite dorénavant, avec un code un poil plus lourd mais qui a l’avantage de supporter tous les charsets :

    function remove_accent($chaine=''){
    // Liste des caractères accentués et leur valeur de remplacement
    $accent = array('%C3%80'=>'A','%C3%81'=>'A','%C3%82'=>'A','%C3%83'=>'A','%C3%84'=>'A','%C3%85'=>'A','%C3%A0'=>'a','%C3%A1'=>'a','%C3%A2'=>'a','%C3%A3'=>'a','%C3%A4'=>'a','%C3%A5'=>'a','%C3%92'=>'O','%C3%93'=>'O','%C3%94'=>'O','%C3%95'=>'O','%C3%96'=>'O','%C3%98'=>'O','%C3%B2'=>'o','%C3%B3'=>'o','%C3%B4'=>'o','%C3%B5'=>'o','%C3%B6'=>'o','%C3%B8'=>'o','%C3%88'=>'E','%C3%89'=>'E','%C3%8A'=>'E','%C3%8B'=>'E','%C3%A8'=>'e','%C3%A9'=>'e','%C3%AA'=>'e','%C3%AB'=>'e','%C3%87'=>'C','%C3%A7'=>'c','%C3%8C'=>'I','%C3%8D'=>'I','%C3%8E'=>'I','%C3%8F'=>'I','%C3%AC'=>'i','%C3%AD'=>'i','%C3%AE'=>'i','%C3%AF'=>'i','%C3%99'=>'U','%C3%9A'=>'U','%C3%9B'=>'U','%C3%9C'=>'U','%C3%B9'=>'u','%C3%BA'=>'u','%C3%BB'=>'u','%C3%BC'=>'u','%C3%BF'=>'y','%C3%91'=>'N','%C3%B1'=>'n');

    // Conversion des caractères accentués dans un code compatible avec les URLs
    $chaine = urlencode($chaine);

    foreach ($accent as $key => $value) { // On parcours le tableau accent grâce à une boucle foreach puis on remplace les caractères accentués par leurs équivalents sans accent
    $chaine = str_replace($key,$value,$chaine);
    }

    // On décode la chaîne d'entrée grâce à la commande urldecode
    return urldecode($chaine);
    }
    Fonction de suppression d'accents compatible tous charsets

    function auto_assign_custom_type_terms( $post_id ) {
    // On reset les termes de cette taxinomie
    wp_set_object_terms( $post_id, null, 'custom-type' );

    // On formate le premier mot du titre
    $first_word = current(explode(' ', get_the_title( $post_id ))); // Récupération du premier mot du titre
    $first_word_without_maj = strtolower($first_word); // Suppression des majuscules éventuelles
    $first_word_totally_formated = remove_accent($first_word_without_maj); // Remplacement d'éventuels caractères accentués en par leurs équivalents non accentués

    // Valeur par défaut du terme
    $tax_slug = 'fiche';

    // On teste le premier mot
    switch( $first_word_totally_formated ) {
    case 'news':
    $tax_slug = $first_word_totally_formated;
    break;
    case 'forum':
    $tax_slug = $first_word_totally_formated;
    break;
    case 'videos':
    $tax_slug = $first_word_totally_formated;
    break;
    }

    // On ajoute le terme
    wp_set_object_terms( $post_id, $tax_slug, 'custom-type', true );
    }
    add_action( 'save_post', 'auto_assign_custom_type_terms', 10, 3 );
    Fonction d'assignement automatique d'un terme en fonction du premier mot du titre de l'article.

6 sujets de 1 à 6 (sur un total de 6)
  • Vous devez être connecté pour répondre à ce sujet.