- WordPress :5.8
- Statut : résolu
- Ce sujet contient 14 réponses, 2 participants et a été mis à jour pour la dernière fois par
Koenmo, le il y a 3 années et 2 mois.
-
AuteurMessages
-
8 novembre 2021 à 22 h 09 min #2388553
Bonjour,
Ma configuration WP actuelle 5.8.1
- Version de PHP/MySQL : 8.0.12
- Thème utilisé : Bookie (Tokopress)
- Extensions en place : Antispam Bee, Autoptimize, Bookie WP Addons, Bookie WP Shortcodes, Classic Editor, ELEX WooCommerce Google Shopping (Google Product Feed) – Basic, Favicon by RealFaviconGenerator, Flexible Shipping, GDPR Cookie Consent, Google Tag Manager for WordPress, Iks Menu Pro, Jetpack, Kadence WooCommerce Email Designer, Loco Translate, Max Mega Menu, Mondial Relay – WordPress, Newsletter, SMTP, Email marketing and Subscribe forms by Sendinblue, PW WooCommerce Gift Cards, Sendinblue – WooCommerce Email Marketing, Shortcodes Ultimate, TI WooCommerce Wishlist Premium, TokoPress Sliders, Ultimate Addons for Gutenberg, WooCommerce, WooCommerce PDF Invoices & Packing Slips, WooCommerce Search Engine, WooCommerce Stripe Gateway, WPBakery Page Builder, WP Sheet Editor – Post Types (Premium), WP Super Cache, Yoast SEO
- Nom de l’hébergeur : O2Switch
- Adresse du site : librairiedamase.com
Problème(s) rencontré(s) :
Bonjour,
J’ai ajouté une série de champs ACF dans la page admin > ajouter un product, afin de pouvoir entrer plus facilement des informations supplémentaires sur le produit (sous les spécifications par défaut du produit Woocommerce : poids, taille). J’ai inséré le code suivant dans le thème enfant function.php, mais cela n’a pas donné de résultat :
<?php $editeur = get_field( 'editeur' ); ?>
<?php if ( $editeur ) : ?>
<a href="<?php echo esc_url( get_term_link( $editeur ) ); ?>"><?php echo esc_html( $editeur->name ); ?></a>
<?php endif; ?>
<?php the_field( 'date_de_parution' ); ?>
<?php the_field( 'nombre_de_volumes' ); ?>
<?php the_field( 'nombre_de_pages' ); ?>
<?php the_field( 'isbn' ); ?>
<?php $presentation = get_field( 'presentation' ); ?>
<?php if ( $presentation ) : ?>
<a href="<?php echo esc_url( get_term_link( $presentation ) ); ?>"><?php echo esc_html( $presentation->name ); ?></a>
<?php endif; ?>
<?php the_field( 'illustrateur' ); ?>J’obtiens un message :
Vos modifications de code PHP ont été annulées en raison d’une erreur sur la ligne 165 du fichier wp-content/themes/bookie-wp-child/functions.php. Veuillez la corriger et réessayer d’enregistrer.
syntax error, unexpected token « <« , expecting end of file
J’ai dû manquer une étape quelque part, mais je ne sais où. J’avoue que je ne connais pas le php et que je me suis contenté d’utliser l’extension « Advanced Custom Fields: Theme Code » qui génère automatiquement le code pour les champs personnalisés.
Je vous remercie d’avance pour votre aide.
8 novembre 2021 à 23 h 01 min #2388554Tu as un caractère < qui traine dans le fichier functions.php à la ligne 165
Ce que je ne comprends pas, c’est pourquoi tu utilises ACF au lieu des attributs de produit de WooCommerce ?
9 novembre 2021 à 20 h 24 min #2388592Merci pour la réponse.
Je ne trouve pas le > dans le fichier php. Est-ce dans le code que j’ai ajouté ? Il se fait que la ligne 165 correspond à la première des lignes ajoutées avec le code mentionné ci-dessus. D’ailleurs dès que je supprime ce code, je n’ai plus de message d’erreur.
Si j’utilise ACF (en tout cas j’espère pouvoir l’utiliser ou une solution équivalente) c’est que les attributs sont un système long et fastidieux avec risque d’erreur d’orthographe. Pour un livre, il faut ajouter les attributs ISBN, éditeur, état de l’ouvrage, date de parution, illustrateur. Et cette procédure doit être renouvelée à chaque nouveau produit.
Y aurait-il une meilleure solution que mon idée de ACF ?
Bonne soirée.
9 novembre 2021 à 23 h 49 min #2388594Oui, encore une fois les attributs de WooCommerce 🙂 🙂 🙂
1- tu peux configurer chaque type d’attribut (hiérarchique ou pas)
2- ce sont des termes de taxonomie, donc d’un point de vue performance de la recherche, c’est bien plus efficace qu’un custom field
3- tu as les mêmes risques d’erreur d’orthographe avec ACF, au moins avec WooCommerce ils te proposent les attributs déjà existant et tu peux voir la liste des attributs pour corriger les éventuelles erreurs à la source
4- tu n’as rien à programmer pour les afficher en front end
Sinon pour ton code, tu ne montres qu’une partie de la page. Mais il est déjà très lourd
Voilà comment je l’écrirais<?php
$editeur = get_field( 'editeur' );
if ( $editeur ) {
echo '<a href="'.esc_url( get_term_link( $editeur ).'">'.esc_html( $editeur->name )."</a>";
}
the_field( 'date_de_parution' );
the_field( 'nombre_de_volumes' );
the_field( 'nombre_de_pages' );
the_field( 'isbn' );
$presentation = get_field( 'presentation' );
if ( $presentation ) {
echo '<a href="'.esc_url( get_term_link( $presentation ).'">'.esc_html( $presentation->name )."</a>";
}
the_field( 'illustrateur' );
?>Tu n’as aucun besoin d’ouvrir et de fermer la balise php à chaque instruction, ça multiplie les risques d’erreur et c’est mauvais pour la performance.
Par ailleurs, il te manque plein de vérifications. Ce n’est pas parce que tu as une valeur de champs personnalisé que tu as un terme correspondant, donc tu peux te retrouver à afficher des erreurs. Et n’oublie pas qu’il faut préciser la taxonomie pour get_term_link, sauf s’il s’agit d’une catégorie (mais là tu cours au devant d’autres ennuis…)
-
Cette réponse a été modifiée le il y a 3 années et 3 mois par
Lumiere de Lune.
-
Cette réponse a été modifiée le il y a 3 années et 3 mois par
Lumiere de Lune.
10 novembre 2021 à 18 h 26 min #2388636Merci pour votre réponse.
Il est vrai qu’il faut garder aux attributs le terme de taxonomie. N’y a-t-il pas moyen de faire un ACF dont le terme des champs « débouchent » en taxonomie ?
Ce que je cherche à éviter pour les fautes, c’est que je ne doive pas entrer à chaque nouveau livre l’intitulé de l’attribut (Auteur, ISBN, etc). C’est déjà le cas pour les dimensions et le poids, car ils sont par défaut dans Woocommerce. J’entre les dimensions dans Données du produit > Expédition, et les intitulés « Poids » et « Dimensions » s’affichent sur le front end sans que je me soucie de l’orthographe. Peut-être que ceci serait une piste.
Merci pour votre simplification de code. Malheureusement, j’obtiens le même message.
10 novembre 2021 à 20 h 42 min #2388641Tu obtiens le même message parce que tu n’as pas donné l’intégralité de ta page de code.
Tu cherches à résoudre un problème « contrôle de saisie » par une solution détournée qui, dans ce cas, n’est absolument pas la bonne. Dans le « meilleur » des cas, tu vas doublonner les termes et les champs personnalisés, et avec de gros problèmes potentiels derrière, par exemple si tu changes un intitulé.
Tu as deux sortes d’attributs dans WC, ceux que tu créés à la volée dans une fiche produit, et ceux que tu vas d’abord créér via « attributs » (sous menu de produits) et pour lesquels tu peux même ajouter des termes directement.
Quand tu es sur l’onglet « Attributs » d’une fiche produit, les attributs que tu as précédemment créés apparaissent dans la liste déroulante et tu peux sélectionner une valeur existante ou en créer une autre. Par contre, si tu cliques simplement sur « Ajouter » sans présélectionner un attribut personnalisé dans la liste, tu vas en créer un avec un nom (par exemple toto) et cet attribut là n’apparait pas sur la liste des attributs personnalisés dans une autre fiche produit.
Donc en créant d’abord ta liste d’attributs, je ne vois pas en quoi la solution ACF est plus performante, au contraire, puisque dans le cas d’un auteur, ACF ne te propose pas la liste des valeurs déjà saisies dans un custom field (c’est possible, mais il faut programmer).
J’ai l’impression que tu cherches à contourner un problème qui n’existe pas parce que tu n’exploites pas une fonctionnalité de WooCommerce (pas bien documentée, je te l’accorde…)
11 novembre 2021 à 18 h 28 min #2388677Encore merci pour votre soin à me répondre clairement.
Je suis d’accord que je cherche à contourner un problème, mais je ne vois pas comment faire autrement. J’essaye d’expliciter mon cas avec clarté :
J’ai besoin des attributs suivants :
Poids (proposé par défaut par WooCommerce), Dimensions (idem), Éditeur, Date de parution, Nombre de volumes, Nombre de pages, ISBN, Présentation, Illustrateur.
L’attribut « Éditeur » a 148 termes que j’ai enregistrés via le menu Attribut. À la page ajout de produit, dans l’onglet « Attribut » je retrouve « Éditeur », je l’ajoute et j’obtiens un menu déroulant avec tous les éditeurs. Soit.
L’attribut « Présentation » a de même 8 termes pré-enregistrés (broché, relié, cartoné, etc).
En revanche, les autres attributs ont des données particulières à chaque produit. Or si j’enregistre dans le menu « Attribut » l’attribut « ISBN », par exemple, je trouverai bien parmi les attributs à ajouter « ISBN » dans l’onglet « attribut » de la page nouveau produit. Seulement, une fois ajouté, je suis obligé de choisir un terme. Et puisque je n’ai enregistré aucun terme prédéfini (puisque les ISBN sont différents pour chaque livre), je me retrouve bloqué. Idem pour les autres attributs.
Dans le fichier joint cas 1, j’ai choisi d’ajouter un Attribut personnalisé du produit. Je dois écrire l’intitulé (ce qui est fastidieux) mais je puis écrire ce que je veux dans l’entrée. C’est ce que je fais jusqu’à présent.
Dans le cas 2, j’ai pré-enregistré ISBN via le menu « Attribut ». J’ai choisi, dans la page ajout de produit, d’ajouter l’attribut « ISBN » mais je ne parviens pas à écrire du texte dans le champ. Je suis obligé de prendre un des termes… inexistants.
Enfin, avec ce système, je suis obligé de charger un à un les attributs, avec risque de ne pas garder le même ordre pour tous les produits. J’aurais aimé pouvoir charger en une fois tous les intitulés. J’ai l’impression que quelque chose m’échappe et qu’il y a une solution quelque part.
Bonne soirée.
Fichiers joints :
Vous devez être connecté pour voir les fichiers joints.11 novembre 2021 à 19 h 39 min #2388685En ce qui concerne l’ordre de saisie des attributs, je crois que tu te prends un peu la tête pour pas grand chose. Penses tu réellement que les visiteurs vont comparer deux fiches produits pour vérifier qu’ils sont bien présentés dans le même ordre ? Tu peux, une fois que tu as fini, les réarranger. Ou modifier l’affichage (ce qui sera quand même beaucoup plus léger que de mettre en branle ACF). Tu as ici le template d’affichage des attributs. Je n’ai pas testé, mais à mon avis juste rajouter une ligne suffirait;
if ( ! $product_attributes ) {
return;
}
ksort ( $product_attributes ) ;Faut tester …
Pour les ISBN, une fois que tu as sélectionné ton attribut personnalisé ISBN, il s’affiche avec une zone de saisie et en bas à droite de la zone un bouton ajouter qui te permet de saisir une nouvelle valeur.
Comme je te l’ai dit plus haut ^^
et tu peux sélectionner une valeur existante ou en créer une autre
11 novembre 2021 à 19 h 55 min #2388688… j’ai vérifié, ça fonctionne. Le critère de tri est le slug de l’attribut, à toi de le renseigner pour qu’il apparaisse dans le bon ordre dans le front-end.
Cette modification doit se faire dans un thème enfant. C’est dans le fichier woocommerce/templates/single-product/product-attributes.php) et tu dois recréer cette structure dans ton thème enfant comme cela : themes/theme-child/woocommerce/single-product/product-attributes.php
-
Cette réponse a été modifiée le il y a 3 années et 3 mois par
Lumiere de Lune.
12 novembre 2021 à 15 h 17 min #2388747Merci pour ces éclaircissements. Je renonce à l’idée des ACF. Je reviens vers vous dès que j’aurai obtenu un résultat. Je suis fort pris à l’instant.
19 novembre 2021 à 12 h 14 min #2389157Me voilà enfin de retour.
Pour les ISBN, une fois que tu as sélectionné ton attribut personnalisé ISBN, il s’affiche avec une zone de saisie et en bas à droite de la zone un bouton ajouter qui te permet de saisir une nouvelle valeur.
Je n’avais pas saisi cette option ; c’est ce qui me faisait bloquer. Je comprends mieux pourquoi je me faisais des nœuds dans le cerveau pour rien. Question à deux sous : n’y a-t-il pas un inconvénient à entrer ainsi des nouveaux termes à chaque produit ? J’ai 1000 produits dans ma boutique, ce qui veut dire 1000 termes pour l’attribut ISBN ; 1000 autres pour l’attribut « nombre de pages »… En soi, cela ne me gêne pas.
Pour ce qui est du code, je n’ai pas obtenu de résultat, mais cela doit venir de ma faute, car mes connaissances en php sont nulles. Je me suis tourné vers un plugin « welaunch group attribute » pour faire le travail.
Mille mercis encore pour tous vos conseils et votre aide.
19 novembre 2021 à 15 h 21 min #2389175Non pas d’inconvénients…. c’est de toute façon plus performant qu’un champs personnalisé. Tu n’as plus besoin du code en utilisant WooCommerce… et surtout tu n’as jamais posté l’intégralité de ton code (toute la page, de
<?php
à la fin… )
19 novembre 2021 à 18 h 03 min #2389187Alea jacta est. Je me mets aux attributs pour de bon et le responsable des ajouts de livres en sera d’autant plus content.
Veuillez m’excuser pour le code ; je ne savais pas que cela se faisait. Le voici :
<?php
/**
* Bookie Child Theme functions and definitions.
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
add_action( 'after_setup_theme', 'toko_load_childtheme_languages', 5 );
function toko_load_childtheme_languages() {
/* this theme supports localization */
load_child_theme_textdomain( 'bookie-wp', get_stylesheet_directory() . '/languages' );
}
/* Please add your custom functions code below this line. */
// Add child theme styles
add_action( 'wp_enqueue_scripts', 'my_plugin_add_stylesheet' );
function my_plugin_add_stylesheet() {
wp_enqueue_style( 'my-style', get_stylesheet_directory_uri() . '/child-style.css', false, '1.0', 'all' );
}
// Add font field in slider
add_filter( 'cmb_meta_boxes', function($meta_boxes){
array_push($meta_boxes[0]['fields'][1]['fields'], array( 'id' => 'font', 'name' => esc_html__( 'Font', 'toko-sliders' ), 'type' => 'select', 'options' => array( 'adobe-jenson-pro' => esc_html__( 'Adobe jenson pro', 'toko-sliders' ), 'alegreya' => esc_html__( 'Alegreya', 'toko-sliders' )), 'cols' => 6 ));
array_push($meta_boxes[0]['fields'][1]['fields'], array( 'id' => 'btn-visibility', 'name' => esc_html__( 'Button visible?', 'toko-sliders' ), 'type' => 'select', 'default' => 'yes', 'options' => array( 'yes' => esc_html__( 'Yes', 'toko-sliders' ), 'no' => esc_html__( 'No', 'toko-sliders' )), 'cols' => 6 ));
return $meta_boxes;
}, 20 );
// Add Adobe fonts to the website
add_action('wp_head', 'add_adobe_fonts');
function add_adobe_fonts(){
?><link rel="stylesheet" href="https://use.typekit.net/lys4yxt.css"><?php
}
// Change slider front view
function wpa_add_child_shortcodes(){
remove_shortcode('toko_shortcode_slider');
add_shortcode( 'toko_slider', 'toko_shortcode_slider_custom_font' );
}
add_action( 'after_setup_theme', 'wpa_add_child_shortcodes' );
function toko_shortcode_slider_custom_font( $atts ) {
extract( shortcode_atts( array(
'id' => '',
'slug' => '',
), $atts ) );
$slides = get_post_meta( $id, '_slides' );
if ( empty( $slides ) )
return;
$output = '';
$count = 0;
foreach ( $slides as $slide ) {
$output_slide = '';
$style = '';
if($slide['font'])
$style = "style=\"font-family: '".$slide['font']."', sans-serif;\"";
if ( trim( $slide['title'] ) ) {
$output_slide .= '<h2 '.$style.' class="toko-slide-title">'.$slide['title'].'</h2>';
}
if ( trim( $slide['desc'] ) ) {
$output_slide .= '<p '.$style.' class="toko-slide-desc">'.$slide['desc'].'</p>';
}
if ($slide['btn-visibility'] == 'yes') {
if ( trim( $slide['btn_text'] ) ) {
$url = $slide['btn_url'] ? esc_url( $slide['btn_url'] ) : '#';
$output_slide .= '<a '.$style.' class="toko-slide-button" href="'.$url.'">'.$slide['btn_text'].'</a>';
}
}
if ( $output_slide ) {
$count++;
if ( $slide['image'] ) {
$image = wp_get_attachment_url( $slide['image'] );
if ( $image ) {
$style = 'style="background-image:url('.$image.');background-size:cover;background-position:center right;background-repeat:no-repeat;" ';
}
}
$output .= '<div class="toko-slide" '.$style.'><div class="toko-slide-inner"><div class="toko-slide-detail">'.$output_slide.'</div></div></div>';
}
}
if ( $output ) {
$class = $count > 1 ? 'toko-slider-active' : '';
$output = '<div class="toko-slider-wrap"><div class="toko-slides '.$class.'">'.$output.'</div></div>';
if ( $count > 1 ) {
$speed = get_post_meta( $id, '_speed', true );
$speed = intval( $speed ) ? $speed : 5000;
$animation = get_post_meta( $id, '_animation', true ) == 'slide' ? '' : 'fadeOut';
$dots = get_post_meta( $id, '_dots', true ) == 'no' ? 'false' : 'true';
$nav = get_post_meta( $id, '_nav', true ) == 'no' ? 'false' : 'true';
$autoplay = get_post_meta( $id, '_autoplay', true ) == 'no' ? 'false' : 'true';
$hoverpause = get_post_meta( $id, '_hover_pause', true ) == 'no' ? 'false' : 'true';
wp_enqueue_script( 'owlcarousel2' );
wp_enqueue_style( 'owlcarousel2' );
$js_code = "jQuery(function($) { $('.toko-slider-active').owlCarousel({items:1, loop: true, autoplayTimeout: $speed, animateOut: '$animation', dots: $dots, nav:$nav, autoplay: $autoplay, autoplayHoverPause: $hoverpause, lazyLoad: true, smartSpeed: 700, autoHeight:true, navText:['<span class=\"slide-prev-nav\"><i class=\"fa fa-angle-left\"></i></span>','<span class=\"slide-next-nav\"><i class=\"fa fa-angle-right\"></i></span>'] }).addClass('owl-carousel owl-theme'); });";
wp_add_inline_script( 'owlcarousel2', $js_code );
}
}
return $output;
}
function wpa_show_permalinks( $post_link, $post ){
if ( is_object( $post ) && $post->post_type == 'show' ){
$terms = wp_get_object_terms( $post->ID, 'book_author' );
if( $terms ){
return str_replace( '%book_author%' , $terms[0]->slug , $post_link );
}
}
return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );
function my_mce_buttons_2( $buttons ) {
/**
* Add in a core button that's disabled by default
*/
$buttons[] = 'superscript';
$buttons[] = 'subscript';
return $buttons;
}
add_filter( 'mce_buttons_2', 'my_mce_buttons_2' );
function wpb_autolink_featured_images( $html, $post_id, $post_image_id ) {
If (! is_singular()) {
$html = '<a href="' . get_permalink( $post_id ) . '" title="' . esc_attr( get_the_title( $post_id ) ) . '">' . $html . '</a>';
return $html;
} else {
return $html;
}
}
add_filter( 'post_thumbnail_html', 'wpb_autolink_featured_images', 10, 3 );
/**
* Bypass logout confirmation.
*/
function iconic_bypass_logout_confirmation() {
global $wp;
if ( isset( $wp->query_vars['customer-logout'] ) ) {
wp_redirect( str_replace( '&', '&', wp_logout_url( wc_get_page_permalink( 'account' ) ) ) );
exit;
}
}
add_action( 'template_redirect', 'iconic_bypass_logout_confirmation' );
<?php $editeur = get_field( 'editeur' ); ?>
<?php if ( $editeur ) : ?>
<a href="<?php echo esc_url( get_term_link( $editeur ) ); ?>"><?php echo esc_html( $editeur->name ); ?></a>
<?php endif; ?>
<?php the_field( 'date_de_parution' ); ?>
<?php the_field( 'nombre_de_volumes' ); ?>
<?php the_field( 'nombre_de_pages' ); ?>
<?php the_field( 'isbn' ); ?>
<?php $presentation = get_field( 'presentation' ); ?>
<?php if ( $presentation ) : ?>
<a href="<?php echo esc_url( get_term_link( $presentation ) ); ?>"><?php echo esc_html( $presentation->name ); ?></a>
<?php endif; ?>
<?php the_field( 'illustrateur' ); ?>Bien entendu, c’était le code avant que je n’ai renoncé aux ACF.
Bonne journée.
-
Cette réponse a été modifiée le il y a 3 années et 2 mois par
Koenmo.
20 novembre 2021 à 2 h 47 min #2389211Ce code est donc inutile 😀 et tu aurais pu le simplifier comme je te l’avais indiqué. C’est une très mauvaise façon de coder de mettre les balises d’ouverture et de fermeture de php à chaque ligne, il ne faut les mettre que lorsqu’on en a réellement besoin (passage de php à html comme à la ligne 35).
Ton erreur vient tout simplement de là. Exactement comme le message d’erreur le dit, tu as un « < » innatendu parce que tu ouvres un balise php en ligne 165 (167 sur ce que tu viens de coller, mais les lignes vides successives ne sont pas comptées), alors que tu étais déjà en php . La balise php ouverte à la fin de la ligne 35 n’a pas été fermée.
Mets simplement
$editeur = get_field( 'editeur' );
if ( $editeur ) {
echo '<a href="'.esc_url( get_term_link( $editeur ).'">'.esc_html( $editeur->name )."</a>";
}
the_field( 'date_de_parution' );
the_field( 'nombre_de_volumes' );
the_field( 'nombre_de_pages' );
the_field( 'isbn' );
$presentation = get_field( 'presentation' );
if ( $presentation ) {
echo '<a href="'.esc_url( get_term_link( $presentation ).'">'.esc_html( $presentation->name )."</a>";
}
the_field( 'illustrateur' );20 novembre 2021 à 13 h 44 min #2389219Merci encore.
-
AuteurMessages
- Vous devez être connecté pour répondre à ce sujet.