6

WordPressプラグインを書くのは初めてです。woocommerceプラグインが単一の製品ページに画像を表示する方法を変更する小さなプラグインを作成しようとしています。具体的には、商品画像がない場合は、プレースホルダー画像を表示するのではなく、画像を保持するdivを「display:none」にします。私が使用している戦略は、add_actionを使用して独自のバージョンのwoocommerceのproduct_image.phpテンプレートをレンダリングしてから、remove_actionを使用して元のproduct_image.phpファイルがレンダリングされないようにすることです。Firebugで「display:none」divを確認できるので、add_actionは明らかに機能しています。ただし、remove_actionは成功していません。

これが私のコードです:

$add_result = add_action( 'woocommerce_before_single_product_summary', 'eba_wc_show_product_images', 10);

function eba_wc_show_product_images() {
    include( 'eba_product-image.php' );
}

$remove_result = remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 30);
echo "<hr/>result of add_result = " . $add_result . "<hr/>";
echo "<hr/>result of remove_result = " . $remove_result . "<hr/>";

woocommerce_before_single_product_summaryフックの元のadd_actionの優先度は20だったので、remove_action30を優先しました。

最後の2つのデバッグステートメントは、add_actionが「1」を返していることを示していますが、remove_actionの結果は空です。どんな助けでも大歓迎です。

4

2 に答える 2

24

私は今、この質問に何度か遭遇しました。誰かが私にこれができると言ってくれたらいいのにと思います。

$priority = has_action('action_name', 'function_name');
remove_action('action_name', 'function_name', $priority);

これにより、実際に優先度をハードコーディングする必要がなくなります。優先度は環境によって異なる場合があります。

于 2013-04-02T17:55:35.203 に答える
15

plugins_loaded中にアクションを削除してみてください。これにより、削除する前に、アクションが確実に追加されていることを確認できます。

add_action('plugins_loaded','alter_woo_hooks');

function alter_woo_hooks() {
    $add_result = add_action( 'woocommerce_before_single_product_summary', 'eba_wc_show_product_images', 10);
    $remove_result = remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 10);

    echo "<hr/>result of add_result = " . $add_result . "<hr/>";
    echo "<hr/>result of remove_result = " . $remove_result . "<hr/>";
}

function eba_wc_show_product_images() {
    include( 'eba_product-image.php' );
}
于 2012-05-20T14:55:01.250 に答える