Ok, parce que la tu utilises ACF du coup on est d'accord ?
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:
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
me retourne
Or, et je ne comprends pas pourquoi, elle me retourne ceci :
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 ?
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 ?
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 :
Si quelqu'un a une meilleure idée, je prends avec joie :)
Merci
Petite question : tu écris ce code dans quel fichier ?
Salut,
Au départ dans mon fichier.php qui contenait l'html qui utilisais ce script puis je l'ai migré dans function.php.
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 ?
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 :
et le html
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 ;)
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 ?
En me relisant je ferai meme ceci
ou en reprennant un peu ta fonction et mon code ci-dessus
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 :
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
y'a rien de sorcier la pour le coup
https://www.advancedcustomfields.com/resources/the_field/
ou sinon tu fais ça directement
et du coup ton code devient
Et dans le cas ou tu aurai ça dans un tableau, au cas ou
d'ailleurs si t'en as pas c'est peut être mieux de faire ceci
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
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 :
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 :
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 :
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:
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.
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.
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 :
et voilà ce que ça retourne, sachant que 'at_stellaire' contient une valeur et pas 'ph_stellaire' :
Vraiment bizarre cette histoire de concaténation qui ne fonctionne pas...