web-dev-qa-db-ja.com

WooCommerceテンプレートのエラーdo_shortcode

私は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;
}

しかし、ショートコードが表示された後にgettinエラーが表示されます。

キャッチされていないエラー:/home/dev/wp-content/themes/dummy-child/woocommerce/single-product/up-sells.php:25のnullでメンバー関数get_upsells()を呼び出し

上記のエラーに関連する行:

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

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

だから私は思う:

  1. ショートコード自体は正しく表示されますが、スクリプトが上記のエラーで実行を停止します

  2. 私がreturn/echo-ingプレーンテキストまたはhtmlでquotation_form関数を出力しようとしたとき、それはエラーなしで完全に動作します

私の質問です:WooCommerceテンプレートにショートコードを挿入するための正しい方法は?それは可能ですか?

ありがとうございました

1
Asisten

私は汚い方法でこれを解決しました..他の誰かがより効率的な解決策、上記の問題に対する私の最終的な作業コードを提供できることを願っています:

$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;
}

だから私は関数の外do_shorcodeを移動し、グローバル変数として宣言します。問題は、Wordpressページの外側で宣言すると$ produk変数が機能しなくなることです。そのため、製品のタイトルの代わりにstr_replaceを使用します。

2
Asisten

あなたの問題は$ product変数が定義されていないことです。 2つの解決策があります。

  • 製品ページにショートコードをレンダリングするだけの場合は、関数の先頭にglobal $product;を書きます。
  • さもなければあなたが取るべき製品を定義する必要があります:global $product; $product_obj = new WC_Product_Factory(); $product = $product_obj->get_product( "insert product id" );。関数の冒頭にも書いてください。
1
Pascal Knecht