woocommerce関連製品をカスタマイズする方法?[閉まっている]


14

Webサイトには、WooCommerceの単一の製品ページの下部に関連製品を表示する次のコード行があります...

functions.php:

// display upsells and related products within dedicated div with different column and number of products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

function woocommerce_output_related_products() {
    $output = null;

    ob_start();
    woocommerce_related_products(4,4); 
    $content = ob_get_clean();
    if($content) { $output .= $content; }

    echo '<div class="clear"></div>' . $output;
}

同じ名前で分類された4つの製品が表示されるので、上記を変更して、代わりに関連するタグを表示するにはどうすればよいですか?

たとえば、「自動車」と呼ばれる製品カテゴリがあり、このカテゴリ内には「Holden」、「Ford」、「Toyota」、「Nissan」などのタグがいくつかあります。

ユーザーが現在表示している製品のタグに関連する4つの製品を下部に表示したいと思います。

回答:


29

まず、質問で示したコードで説明した目標をすぐに達成することはできません。そのコードに直接的なアプローチがない理由を理解するには、使用woocommerce_related_products()しているものを確認する必要があります。

第二に、あなたは理解する必要があります、そうでなければ、あなたは答えを確実に得るために絶対にあなたの目標であるはずのオンポイントの質問をすることができないからです。加えて、あなたはそれを心に留めておく必要があることをWordpressの開発は、 WordPressのコア関連の質問に、それの主なスコープが設定されている-あなたは、これは上の議論の下に興味を持っている場合はWordpressの開発、メタ、ある特定のトピックであることWPSEで私たちのwooesとプラットフォームプラグインの未来を。したがって、woocommerceのようなプラグインについて質問している場合は、それを分解してコア機能にできるだけ関連するようにする必要があります-次のポイントを参照-あなたがすべてのプラグインの詳細を知ることは期待できないため使用しています。

第三に、今何が起こっているのか、より深い洞察を得ることができます。あなたが言ったように、あなたはwoocommerce_related_products()今使っています。ソースを見ると、この関数woocommerce_get_template()related.phpテンプレートを取得するために使用していることがわかります。woocommerce_get_template()再びwoocommerce_locate_template()テンプレートを見つけるために使用しますが、後者はwordpressコア関数を使用してそうしていますlocate_template()
現在、コアに戻る接続があり、上記の-できれば検査済みの-woocommerce機能は、本質的にコア機能を拡張するためのラッパーであることがわかります。機能の依存関係を分析することで明らかになったもう1つのことは、以前に言ったことですが、目標を達成するには別のアプローチが必要だということですwoocommerce_related_products()
あなたが私の説明で私に従い、これまでに完全に読んだrelated.phpなら、あなたは探しているものが含まれていることに気づきました。私は特に話しているget_related()含む関数、woocommerce_product_related_postsフックをし、コア機能を使用するwp_get_post_terms()get_posts()- get_related()IDのセットを取得するために使用されます。さらにそこにあるwoocommerce_related_products_args関連製品のクエリ内部の引数を変更するために使用することができますフック、related.phpWP_Queryこのために使用されます。クエリは、get_related()呼び出しの結果のIDを使用します。
問題を解決するためにすべてを手に入れたと思います。実際、それ以上に、関連製品のカスタマイズ方法に関するほぼ完全な概要を提供します。検査されたソースコードのうち、すべての機能(関数および/またはフック)については言及しませんでしたが、間違いなくすべての重要な機能について言及しました。これで、woocommerceの関連製品の機能がwordpressのコア機能にどのように遡ることができるかがより明確になるはずです。

第4に、カスタマイズを適用する場所と、要求するべき場所に行きます。たとえば、次のようなものです。

Woocommerceには、呼び出しをwoocommerce_product_related_postsカスタマイズしてget_posts()関連製品を決定するためのフックがあります。

コード:

        // Get the posts
        $related_posts = get_posts( apply_filters('woocommerce_product_related_posts', array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                        'relation' => 'OR',
                        array(
                                'taxonomy' => 'product_cat',
                                'field' => 'id',
                                'terms' => $cats_array
                        ),
                        array(
                                'taxonomy' => 'product_tag',
                                'field' => 'id',
                                'terms' => $tags_array
                        )
                )
        ) ) );

これをカスタマイズして目標を達成するにはどうすればよいですか?これは、表示されている単一の製品product_catと同じ製品カテゴリにあり、同じタグを持つ関連製品を表示するproduct_tagことです。

結論を出さずに-少なくとも完全で既製のコードを取得することが期待される場合は-答えは、おそらく最初にすべきことはtax_queryパラメーターをrelationからORに変更することANDです。





ノート:

  • 上記のリンクされた進行中の議論を念頭に置いて、これをより長い説明的な答えにしました
  • それはあなたの質問への答えであるだけでなく、一般的な教育目的を達成するためにさらに追求することを気にしないでください
  • 実際に既製のコードがないため、これはテストされていません
  • 最後に大事なことを言い忘れていますが、woocoomerce 2.1のリリースでいくつかの重要なコードの変更が実装されることは予見できます。



編集:

コアクラスを直接(プラグイン)編集しないでください。コアファイルは更新され、実行すると上書きされるため、更新の変更を再度維持する必要があるため、問題があります。特にこの場合のように簡単に回避できる場合、以下のコードは、とにかくあなたが意図したことを行いますfunctions.php。つまり、を介してこの変更を実装します。

コード:

    add_filter( 'woocommerce_product_related_posts', 
                'wpse_123436_change_wc_related_products_relation_to_and' );
    function wpse_123436_change_wc_related_products_relation_to_and() {
            $get_related_products_args = array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                    'relation' => 'AND',
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'id',
                        'terms' => $cats_array
                    ),
                    array(
                        'taxonomy' => 'product_tag',
                        'field' => 'id',
                        'terms' => $tags_array
                    )
                )
            );
            return $get_related_products_args;
    }



WooCommerce バージョン2.1.0以降では、上記のフックはもう存在しないため機能しません。そのため、答えはバージョン2.0.20まで使用可能です。しかし、@ NathanPowellは、v2.1.0から利用可能で、関連製品の使用可能なフックのセットのカスタマイズに関して、StackOverflowで素晴らしい答えを発見しました。


迅速かつ詳細な対応をしてくださった@ialocinに感謝します。一時的な措置として、ファイルのORANDに変更しただけで、wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phpファイル内から実行されるようにすぐに変更しfunctions.phpます。ありがとうございました。
user1752759

@ user1752759これを行うには、編集を参照してくださいfunctions.php
ニコライ

完璧な答え!プラグインを理解する方法、およびプラグインをニーズに合わせて拡張する方法に関するガイドブックで使用する必要があります。しかし、これらの本が存在するかどうかは
わかり

@ThdKありがとう、それがそんなに良いかどうかはわかりませんが、それを書いてから初めて読んだ後、私は答えにまだ満足しています。 WC 2.1.xでこれを試しましたか?
ニコライ14

こんにちは、@ ialocin。下部の編集バージョンにはいくつかの閉じ括弧がありませんが、残念ながらバージョン2.1.8ではソリューションとして機能していません。それほど問題にならない場合は、これを更新してください。
user1752759

2

ここでみんなをだましてはいけません。受け入れられた答えは、ユーザーを目標に到達させただけです。

最初の問題はここにあります:

<?php
// display upsells and related products within dedicated div with different column and number of    products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

アクションが削除され、削除された正確な位置に配置されます。目標は完全に不明です。

TAGSとCATEGORIESがwoocommerce_output_related_productsこのプラグインの機能を駆動していることを理解していなかったため、関連製品を検索してこれに出会いました。

この質問に対する最良の回答は次のリンクであり、woocommerce_output_related_products_args()フィルターに関連するすべてがあります:https : //stackoverflow.com/questions/23554993/output-posts-relating-to-the-tags


これは実際には非常に面白いです。なぜあなたが尋ねるかもしれない、なぜならあなたが私の答えを注意深く読んだなら、あなたは見たであろうから、それはただ一つのフィルターを使用するからだ。正確にその時点で利用可能な唯一のフィルターですが、実際に私が書いたものを読んでいて、異なるバージョンのソースファイルを見るのに時間がかかっていた場合、あなたはそれを知っていたでしょう。ただ言って。それとは別に、リンクした答えは、sine v2.1で利用可能な新しいフックを非常によく説明しています。
ニコライ14年

申し訳ありませんが、深夜でした。OPによるコードの明らかな欠陥について少し説明したいと思っていました。
ネイサンパウエル14年

心配はありませんが、何かを言わなければならないと感じました。
ニコライ14年

あなたの参照リンクは私にとってはうまくいきました。今、私は適切にフィルターを適用することを知っています:)
marcovega
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.