Die Handhabung benutzerdefinierter Taxonomien für WooCommerce erfolgt in der Funktion wc_get_products.
P粉404539732
P粉404539732 2023-07-19 16:17:09
0
1
474

Ich registriere eine Taxonomie mit der Standardaktion:

add_action( 'init', 'product_brand_order_taxonomy' );
function product_brand_order_taxonomy()  {
    $labels = array(
        'name'                       => 'Brand Heirarchy',
        'singular_name'              => 'Brand Heirarchy',
        'menu_name'                  => 'Brand Heirarchy',
        'all_items'                  => 'All Brand Heirarchies',
        'parent_item'                => 'Parent Brand Heirarchy',
        'parent_item_colon'          => 'Parent Brand Heirarchy:',
        'new_item_name'              => 'New Brand Heirarchy Name',
        'add_new_item'               => 'Add New Brand Heirarchy',
        'edit_item'                  => 'Edit Brand Heirarchy',
        'update_item'                => 'Update Brand Heirarchy',
        'separate_items_with_commas' => 'Separate Brand Heirarchy with commas',
        'search_items'               => 'Search Brand Heirarchies',
        'add_or_remove_items'        => 'Add or remove Brand Heirarchies',
        'choose_from_most_used'      => 'Choose from the most used Brand Heirarchies',
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => true,
    );
    register_taxonomy( 'brand_heirarchy', 'product', $args );
    register_taxonomy_for_object_type( 'brand_heirarchy', 'product' );
}

Später möchte ich das Produkt anhand einiger Parameter erhalten. Ich möchte auch, dass die Markenhierarchie (brand_heirarchy) in die Ergebnisse einbezogen wird.

$products = array(
    'post_status' => 'publish',
    'limit' => -1,
    'category' => $parent_brand_slugs
);

$products = wc_get_products($product_args);

In den zurückgegebenen Daten erhalte ich die Kategorie-ID wie folgt:

[category_ids] => Array
    (
        [0] => 30
        [1] => 27
        [2] => 25
        [3] => 24
    )

Aber ich möchte, dass auch die mit dem Produkt verknüpfte Marken-ID zurückgegeben wird.

Bei den meisten Inhalten, die ich sehe, geht es darum, wie man Produkte nach benutzerdefinierten Taxonomien filtert. Ich möchte nur wissen, welche Taxonomien mit Produkten verknüpft sind.

Ich habe herausgefunden, dass Woocommerce dies nicht zulässt: https://github.com/woocommerce/woocommerce/issues/13138

Ich habe versucht, den Filter woocommerce_product_object_query_args zu verwenden, konnte aber nicht herausfinden, wie man ihn verwendet. Es gibt auch einen Produktsuchfilter, aber dieser scheint nicht zu funktionieren.

Derzeit denke ich, dass der beste Weg darin besteht, jedes Produkt zu durchlaufen und so etwas wie wp_get_object_terms($data['id'], 'brand_heirarchy') zu verwenden, aber das scheint nicht effizient zu sein.

Ich habe WordPress schon lange nicht mehr verwendet, daher habe ich mich wirklich gefragt, ob es einen effizienteren Weg gibt, die mit jedem Produkt verknüpften Taxonomien abzurufen.

Vielen Dank.

Oh, wp_get_object_terms und wp_get_post_terms scheinen leere Arrays zurückzugeben, während Produkten tatsächlich Markenstufen zugewiesen sind.

P粉404539732
P粉404539732

Antworte allen(1)
P粉770375450

使用wc_get_products()完全可以处理自定义分类法。你没有在正确的地方搜索,因为这是在WC_Product_Data_Store_CPT类中使用可用的过滤器钩子woocommerce_product_data_store_cpt_get_products_query来处理的。

因此,对于你的自定义产品分类法brand_heirarchy,你将使用以下代码:

add_filter( 'woocommerce_product_data_store_cpt_get_products_query', 'handle_custom_query_var', 10, 2 );
function handle_custom_query_var( $query_args, $query_vars ) {
    if ( ! empty( $query_vars['brand'] ) ) {
        $query_args['tax_query'][] = array(
            'taxonomy'          => 'brand_heirarchy',
            'field'             => 'slug',
            'terms'             => $query_vars['brand'],
        );
    }
    return $query_args;
}

然后现在你可以在wc_get_products()函数中使用你的自定义分类法,例如:

$products = wc_get_products( array(
    'status' => 'publish',
    'limit' => -1,
    'brand' => $brand_slugs // array
) );

现在应该可以了

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!