まず、質問で示したコードで説明した目標をすぐに達成することはできません。そのコードに直接的なアプローチがない理由を理解するには、使用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.php
、WP_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で素晴らしい答えを発見しました。
OR
をAND
に変更しただけで、wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.php
ファイル内から実行されるようにすぐに変更しfunctions.php
ます。ありがとうございました。