web-dev-qa-db-fra.com

Erreur do_shortcode dans le modèle WooCommerce

J'essaie d'insérer un shortcode via add_action:

add_action('woocommerce_single_product_summary', 'quotation_form', 61);
function quotation_form()
{
$produk = get_the_title();
$shortkode = sprintf(
'[zendesk_request_form size="3" group="extra-field" subject="Quotation For %s"]',
$produk
);
$shortkode = do_shortcode( $shortkode );
echo $shortkode;
}

Mais l'erreur gettin après l'affichage du shortcode:

Erreur non capturée: appelez la fonction get_upsells () sur null dans /home/dev/wp-content/themes/dummy-child/woocommerce/single-product/up-sells.php:25

La ligne associée à l'erreur ci-dessus:

if ( ! $upsells = $product->get_upsells() ) {
return;
}

Source: https://github.com/woocommerce/woocommerce/blob/master/templates/single-product/up-sells.php

Donc je pense:

  1. Le shortcode lui-même s'affiche correctement mais l'arrêt du script est exécuté avec l'erreur ci-dessus

  2. Lorsque j'ai essayé de générer une fonction quotation_form avec un texte renvoyé/renvoyé ou du code HTML, cela fonctionne parfaitement, sans erreur

Ma question est la suivante: comment insérer correctement le shortcode dans le modèle WooCommerce? Est-ce possible de faire ça?

Je vous remercie

1
Asisten

J'ai résolu ceci de manière sale. J'espère que quelqu'un d'autre pourra fournir une solution plus efficace, mon code de travail final pour le problème ci-dessus:

$shortkode = '[zendesk_request_form size="3" group="extra-field" subject="Quotation For -wkwkwk-"]';
$shortkode = do_shortcode( $shortkode );
add_action('woocommerce_single_product_summary', 'quotation_form', 61);
function quotation_form()
{
$produk = get_the_title();
global $shortkode;
$shortkode = str_replace("-wkwkwk-", $produk, $shortkode);
echo $shortkode;
}

Donc, je sors de la fonction extérieure do_shorcode, puis le déclare comme variable globale. Le problème est que ma variable $ produk ne fonctionnera pas si elle est déclarée en dehors de la page Wordpress. J'utilise donc str_replace pour remplacer le titre du produit précédent.

2
Asisten

Votre problème est que la variable $ product n'est pas définie. Je vois deux solutions possibles:

  • Si vous ne rendez le shortcode que sur une page de produit, écrivez global $product; au début de votre fonction.
  • Sinon, vous devez définir le produit à prendre: global $product; $product_obj = new WC_Product_Factory(); $product = $product_obj->get_product( "insert product id" );. Également écrire ceci au début de la fonction.
1
Pascal Knecht