Bonjour,

Je rencontre un petit problème avec mon code.

Je voudrais créer un lien <a href...> dans mon code suivant une condition. Ma condition fonctionne très bien mais c'est mon print() qui est récalcitrant, enfin surtout ma façon d'écrire ce que je souhaite je pense.

Voilà mon PHP:

<?php
function change_link_test($field){
    if( get_field($field) ): print('<a href="' . the_field($field) . '"class="show" target="_blank">'); 
else : print('<span>');
endif;
} ?>

La valeur de the_field($field) est exactement http://www.stereoptik.com/wp-content/uploads/2021/01/dossier-stellaire.pdf La condition est la présence ou pas du champs $field.

Je voudrais que ma fonction

<p><?php change_link_test('ds_stellaire');?>dossier spectacle</a></p>

me retourne

<p><a href="http://www.stereoptik.com/wp-content/uploads/2021/01/dossier-stellaire.pdf" class="show" target="_blank">dossier spectacle</a></p>

Or, et je ne comprends pas pourquoi, elle me retourne ceci :

<p>http://www.stereoptik.com/wp-content/uploads/2021/01/dossier-stellaire.pdf
<a href="" class="show" target="_blank">dossier spectacle</a></p>

Quelqu'un pourrait-il me dire ce qui ne va pas ?
Merci beaucoup

21 réponses


Tu as deux problèmes de syntaxes déjà. Ton </a> se termine avant ton </p> mais ton <a> commence dans ta méthode , c'est un peu weird non ? Tu devrais le faire commencer et finir dans "change_link_test" ? Ensuite ton attribut "class" touche le double guillemet fermant du href. Essaies peut être de reprendre pas à pas ce que tu as fait ? Genre commencer par corriger ta syntaxe, mettre ton fichier dans le p, remettre ton <a></a> etc ?

hatfab
Auteur

Alors, je ne peux pas faire finir mon </a> dans mon change_link_test() car la fin de la chaîne "dossier spectacle" change à chaque ligne. Mais d'après ce que j'ai écrit il y a bien <p><a> au début et </a></p> à la fin il me semble.
Ensuite, j'ai écarté les guillemets dont tu parles comme ceci if( get_field($field) ): print('<a href="' . the_field($field) . '" class="show" target="_blank">'); mais ça ne change rien, j'ai toujours l'url au début et le href vide.
Une autre idée ?

hatfab
Auteur

Après quelques recherches, il semblerait que print() ne supporte pas le concaténation. Ça n'a pas fonctionné avec echo() non plus.
Voilà ce que j'ai dû faire pour que cela fonctionne :

<?php
function change_link_test($field){
      if( get_field($field) ):
 print('<a href="');
 print(the_field($field));
 print('"');
else : print("");
endif;
} ?>

Si quelqu'un a une meilleure idée, je prends avec joie :)

Merci

Petite question : tu écris ce code dans quel fichier ?

hatfab
Auteur

Salut,
Au départ dans mon fichier.php qui contenait l'html qui utilisais ce script puis je l'ai migré dans function.php.

Ok, parce que la tu utilises ACF du coup on est d'accord ?

hatfab
Auteur

Tout à fait, et tout fonctionne bien de cette façon mais je trouve mon enchainement de print() pas très propre. J'aurais préféré pouvoir concaténer ma chaine mais je n'ai pas trouvé comment. Tout ce qui est print ou echo ('text' . function() . $var . 'text' ) ne fonctionne pas.

ok, parce que moi pour afficher ce lien je le ferai dans mon fichier "ma_page.php" et je ferai plus un truc du style :

<?php if(get_field('mon_champ')) :
$monChamp = the_field('mon_champ');
?>

<a href="<?php echo $monChamp ?>;"></a>

<?php endif; ?>

Bon après je ne sais pas de quel type est ton champ exactement, pour que tu puisse récupérer un tableau avec le titre et le lien. Mais pas la peine je pense de faire une fonction expré.

Comment on intégre du code proprement d'ailleurs ?

hatfab
Auteur

Oui mais c'est plus compliqué que ça car je veux que s'il n'y a pas de champs ça ne soit pas un lien, donc si le champs existe on ajoute un <li><a href=".. etc"> et sinon seulement un <li>, d'où mon bordel de print à rallonge.
Voici le code complet pour mieux comprendre :

// FR On vérifie si le champs contient quelque chose pour changer la class du lien

function change_class($field){
    if( get_field($field) ): print('show');
else : print('hide');
 endif;
}

// FR On vérifie si le champs contient quelque chose pour modifier le lien
function change_link($field){
    if( get_field($field) ):    print('<li><a href="');
                                print(the_field($field));
                                print('"');
else : print('<li');
endif;
}

et le html

div class="dl-cadre dl-cadre-first">
         <h4>stellaire</h4>
         <img src="<?php the_field('af_stellaire'); ?>" alt="Affiche Stellaire"/>
         <ul>
            <?php change_link('ds_stellaire'); ?> class="<?php change_class('ds_stellaire'); ?>" target="_blank">dossier spectacle</a></li>
            <?php change_link('ft_stellaire'); ?> class="<?php change_class('ft_stellaire'); ?>" target="_blank">fiche technique</a></li>
            <?php change_link('at_stellaire'); ?> class="<?php change_class('at_stellaire'); ?>" target="_blank">atelier</a></li>
            <?php change_link('ph_stellaire'); ?> class="<?php change_class('ph_stellaire'); ?>" target="_blank">photos</a></li>
            <?php change_link('rp_stellaire'); ?> class="<?php change_class('rp_stellaire'); ?>" target="_blank">revue de presse</a></li>
            <?php change_link('vd_stellaire'); ?> class="<?php change_class('vd_stellaire'); ?>" target="_blank">vidéo (Via Vimeo)</a></li>
         </ul>
    </div>

Tu peux mettre tout ça dans ton if du coup non ?
Si il y a le champ, tu met le lien, sinon tu met des <li>

Je dois peut être pas comprendre ;)

hatfab
Auteur

Nan parce que (the_field($field)) ne renvoie que http://monlien. Donc je dois ajouter <li><a href=" avec mon print et seulement <li> s'il n'y a pas de lien.
Voilà

Humm et ceci ça le fait ?

      <div class="dl-cadre dl-cadre-first">
          <h4>stellaire</h4>
          <img src="<?php the_field('af_stellaire'); ?>" alt="Affiche Stellaire"/>
          <ul>
              <?= get_field('ds_stellaire') 
              ? '<li><a href="'.the_field('ds_stellaire').'" class="'.change_class('ds_stellaire').'" target="_blank">dossier spectacle</a></li>'
              : '<li>dossier spectacle</li>';
              ?>
              <?= get_field('ft_stellaire') 
              ? '<li><a href="'.the_field('ft_stellaire').'" class="'.change_class('ft_stellaire').'" target="_blank">fiche technique</a></li>'
              : '<li>fiche technique</li>';
              ?>
              <?= get_field('at_stellaire') 
              ? '<li><a href="'.the_field('at_stellaire').'" class="'.change_class('at_stellaire').'" target="_blank">atelier</a></li>'
              : '<li>atelier</li>';
              ?>
              <?= get_field('ph_stellaire') 
              ? '<li><a href="'.the_field('ph_stellaire').'" class="'.change_class('ph_stellaire').'" target="_blank">photos</a></li>'
              : '<li>photos</li>';
              ?>
              <?= get_field('rp_stellaire') 
              ? '<li><a href="'.the_field('rp_stellaire').'" class="'.change_class('rp_stellaire').'" target="_blank">revue de presse</a></li>'
              : '<li>revue de presse</li>';
              ?>
              <?= get_field('vd_stellaire') 
              ? '<li><a href="'.the_field('vd_stellaire').'" class="'.change_class('vd_stellaire').'" target="_blank">vidéo (Via Vimeo)</a></li>'
              : '<li>vidéo (Via Vimeo)</li>';
              ?>
          </ul>
      </div>

En me relisant je ferai meme ceci

      <div class="dl-cadre dl-cadre-first">
          <h4>stellaire</h4>
          <img src="<?php the_field('af_stellaire'); ?>" alt="Affiche Stellaire"/>
          <ul>
              <li>
                  <?= get_field('ds_stellaire') 
                  ? '<a href="'.the_field('ds_stellaire').'" class="'.change_class('ds_stellaire').'" target="_blank">dossier spectacle</a>'
                  : 'dossier spectacle';
                  ?>
              </li>
              <li>
                  <?= get_field('ft_stellaire') 
                  ? '<a href="'.the_field('ft_stellaire').'" class="'.change_class('ft_stellaire').'" target="_blank">fiche technique</a>'
                  : 'fiche technique';
                  ?>
              </li>
              <li>
                  <?= get_field('at_stellaire') 
                  ? '<a href="'.the_field('at_stellaire').'" class="'.change_class('at_stellaire').'" target="_blank">atelier</a>'
                  : 'atelier';
                  ?>
              </li>
              <li>
                  <?= get_field('ph_stellaire') 
                  ? '<a href="'.the_field('ph_stellaire').'" class="'.change_class('ph_stellaire').'" target="_blank">photos</a>'
                  : 'photos';
                  ?>
              </li>
              <li>
                  <?= get_field('rp_stellaire') 
                  ? '<a href="'.the_field('rp_stellaire').'" class="'.change_class('rp_stellaire').'" target="_blank">revue de presse</a>'
                  : 'revue de presse';
                  ?>
              </li>
              <li>
                  <?= get_field('vd_stellaire') 
                  ? '<a href="'.the_field('vd_stellaire').'" class="'.change_class('vd_stellaire').'" target="_blank">vidéo (Via Vimeo)</a>'
                  : 'vidéo (Via Vimeo)';
                  ?>
              </li>
          </ul>
      </div>

ou en reprennant un peu ta fonction et mon code ci-dessus

      function change_link($field, $title){
          if( get_field($field) ) {
              return '<a href="'.the_field($field).'" class="'.change_class($field).'" target="_blank">'.$title.'</a>';
          } else {
              return $title;
          }
       }
       // Version ternaire
       function change_link($field, $title){
            return get_field($field) 
                 ? '<a href="'.the_field($field).'" class="'.change_class('ds_stellaire').'" target="_blank">'.$title.'</a>' 
                 : $title;
        }
      ?>

      <div class="dl-cadre dl-cadre-first">
          <h4>stellaire</h4>
          <img src="<?php the_field('af_stellaire'); ?>" alt="Affiche Stellaire"/>
          <ul>
              <li>
                <?= change_link('ds_stellaire', 'dossier spectacle') ?>
              </li>
              <li>
                <?= change_link('ft_stellaire', 'fiche technique') ?>
              </li>
              <li>
                <?= change_link('at_stellaire', 'atelier') ?>
              </li>
              <li>
                <?= change_link('ph_stellaire', 'photos') ?>
              </li>
              <li>
                <?= change_link('rp_stellaire', 'revue de presse') ?>
              </li>
              <li>
                <?= change_link('vd_stellaire', 'vidéo (Via Vimeo)') ?>
              </li>
          </ul>
      </div>
hatfab
Auteur

Salut MickaelTD,

C'est beau c'est propre j'adore ! Le seul truc c'est que la concaténation ne fonctionne pas non plus. Voilà ce que ça me sort pour le premier <li> dans tes deux versions :

<li>
http://www.stereoptik.com/wp-content/uploads/2021/01/dossier-stellaire.pdfshow<a href="" class="" target="_blank">dossier spectacle</a>
</li>

Et pour le return : $title il manque la classe mais ça c'est pas grave je peux l'ajouter

Salut hatfab, je suis pas un expert de WP

Mais quand je lis la doc ça parait pourtant simple ou alors le return ce fait mal, essaie avec un truc comme ça du coup, j'ai fait un cc de la doc

          function change_link($field, $title){
              if( get_field($field) )
                   echo '<a href="'.the_field($field).'" class="'.change_class($field).'" target="_blank">'.$title.'</a>';
              else echo '$title';
          }

y'a rien de sorcier la pour le coup
https://www.advancedcustomfields.com/resources/the_field/

ou sinon tu fais ça directement

          function change_link($field, $title){
              if( get_field($field) )
                   echo '<li><a href="'.the_field($field).'" class="show" target="_blank">'.$title.'</a></li>';
              else echo '<li class="hide">.'$title.'</li>';
          }
          ou
          function change_link($field, $title){
            if( get_field($field) ) {
                $link = the_field($field);
                echo '<li><a href='.$link.' class="show" target="_blank">'.$title.'</a></li>';
            }   else echo '<li class="hide">'.$title.'</li>';
          }

et du coup ton code devient

      <div class="dl-cadre dl-cadre-first">
          <h4>stellaire</h4>
          <img src="<?php the_field('af_stellaire'); ?>" alt="Affiche Stellaire"/>
          <ul>
              <?php
                change_link('ds_stellaire', 'dossier spectacle')
                change_link('ft_stellaire', 'fiche technique') 
                change_link('at_stellaire', 'atelier') 
                change_link('ph_stellaire', 'photos') 
                change_link('rp_stellaire', 'revue de presse') 
                change_link('vd_stellaire', 'vidéo (Via Vimeo)') 
              ?>
          </ul>
      </div>

Et dans le cas ou tu aurai ça dans un tableau, au cas ou

      <div class="dl-cadre dl-cadre-first">
          <h4>stellaire</h4>
          <img src="<?php the_field('af_stellaire'); ?>" alt="Affiche Stellaire"/>
          <ul>
              <?php
                foreach($fields as $field) {
                    change_link($field->key, $field->title)
                }
              ?>
          </ul>
      </div>

d'ailleurs si t'en as pas c'est peut être mieux de faire ceci

      $fields = array (
          "ds_stellaire" => "dossier spectacle",
          "ft_stellaire" => "fiche technique",
          "at_stellaire" => "atelier",
          "ph_stellaire" => "photos",
          "rp_stellaire" => "vidéo (Via Vimeo)",
       )

       <div class="dl-cadre dl-cadre-first">
          <h4>stellaire</h4>
          <img src="<?php the_field('af_stellaire'); ?>" alt="Affiche Stellaire"/>
          <ul>
              <?php
                foreach($fields as $field => $value) {
                    change_link($field, $value)
                }
              ?>
          </ul>
      </div>

Au moins si ta des nouvelles entrées t'aura juste l'ajouter dans l'array $fields si tu n'a pas de tableau en BDD

hatfab
Auteur

Non y'a rien de sorcier en effet. Je n'ai aucun problème avec la manipulation des champs ACF. Le problème réside dans la concaténation des éléments.
Ici dans ta dernière proposition ça donne :

<li>
 http://www.stereoptik.com/wp-content/uploads/2021/01/atelier-stellaire-adulte.pdfshow<a href="" class="" target="_blank">atelier</a>
 </li>

C'est à dire rien de différent qu'avec mes exemples avec echo() ou print() ou j'ai dû décliner en 3 lignes pour obtenir ce que je voulais :


function change_link($field){
    if( get_field($field) ):
                                print('<li><a href="');
                                print(the_field($field));
                                print('"');
else : print('<li');
endif;
}
hatfab
Auteur

Jai lu la suite de ton message après coup. Merci pour toutes ces versions, c'est très enrichissant. Néanmoins, quoique l'on fasse, le problème de concaténation persiste et j'obtiens toujours ceci en html :

<ul>
    http://www.stereoptik.com/wp-content/uploads/2021/01/dossier-stellaire.pdf<li><a href="" class="show"
            target="_blank">dossier spectacle</a></li>
    http://www.stereoptik.com/wp-content/uploads/2020/11/MAJ2-STELLAIRE-Contrat-Technique-STEREOPTIK.pdf<li><a href=""
            class="show" target="_blank">fiche technique</a></li>
    http://www.stereoptik.com/wp-content/uploads/2021/01/atelier-stellaire-adulte.pdf<li><a href="" class="show"
            target="_blank">atelier</a></li>
    <li class="hide">photos</li>http://www.stereoptik.com/wp-content/uploads/2020/11/VISUELS-STELLAIRE-1.zip<li><a
            href="" class="show" target="_blank">revue de presse</a></li>https://vimeo.com/343213258<li><a href=""
            class="show" target="_blank">vidéo (Via Vimeo)</a></li>
</ul>

C'est une histoire de fou, le lien ne veut pas rester dans sont href

Bonsoir.
Il y a une chose qui m'échappe, le nom de la fonction et le code HTML qu'elle génère, ne correspondent pas.
Sinon regardes par exemple du côté de sprintf.
Exemple:

function change_link($field, $title, $class = 'show')
{
    $out = '...';
    if (get_field($field)) {
        $out = sprintf('<a href="%s" class="%s" target="_blank">%s</a>', the_field($field), $class, $title);
    }
    return $out;
}

Je te conseille d'éviter de faire des echo ou autre dans les fonctions, ce n'est pas aux fonctions de faire l'affiche, mais plutôt de retourner une valeur.
L'affichage c'est après le retour de la fonction qu'il doit être fait et non la fonction elle même.
Autre remarque, évites d'imposer l'ouverture d'un nouvel onglet via un lien, hormis à la rigueur pour des liens externes à ton site.

hatfab
Auteur

Salut, pour bien expliquer ce que je cherche à faire :

J'ai 6 cartouches contenants chacun une liste de 6 noms qui représentent des ZIP à télécharger ou des PDF à consulter (d'où le target="blank"). Les éléments sont gérés par Advanced Custom Field (ACF).

Voici la page qui fonctionne très bien avec mon code tout moche.

Tous les ZIP ou PDF ne sont pas forcement présent suivant le cas. Je souhaite que lorsqu'il y a un élément à télécharger le nom devienne un lien évidemment, mais que cela reste un nom basic lorsqu'il n'y a rien à télécharger. D'où le nom de la fonction change_link

Alors peut-être que je me complique la vie notamment avec l'ajout de class puisque finalement je peux cibler les <li> simple et les <li><a> indépendamment, mais sinon voilà l'histoire.

Merci à vous

Bonsoir.
D'accord pour le nom.
Sinon dans l'exemple que j'ai présenté, à la place des 3 points que j'ai mis au début à la variable out, il te suffit de mettre le texte par défaut, soit la valeur de la variable title par exemple.
De cette manière si la condition n'est pas respectée, ce sera cette valeur qui sera retournée, dans le cas contraire, ce sera le lien généré dans la condition.

hatfab
Auteur

Salut Lartak,

Malgré toutes les solutions apportées, il est toujours impossible de formater correctement mon lien autrement que par mes 3 lignes de print. Le sprintf ne fonctionne pas mieux que print ou echo
Voilà ton code :

<?php
function change_link_test($field, $title, $class = 'show')
{
    $out = $title;
    if (get_field($field)) {
        $out = printf('<a href="%s" class="%s" target="_blank">%s</a>', the_field($field), $class, $title);
    }
    return $out;
}
?>
<ul>
    <?php
      change_link_test('at_stellaire', 'atelier');
      change_link_test('ph_stellaire', 'photos');
    ?>
</ul>

et voilà ce que ça retourne, sachant que 'at_stellaire' contient une valeur et pas 'ph_stellaire' :

<ul>
    http://www.stereoptik.com/wp-content/uploads/2021/01/atelier-stellaire-adulte.pdf<a href="" class="show" target="_blank">atelier</a></ul>

Vraiment bizarre cette histoire de concaténation qui ne fonctionne pas...