SQL 按类别获取 WooCommerce 产品的查询不起作用,我缺少什么?

SQL query to get WooCommerce products by category is not working, what am I missing?

我有以下 SQL 代码效果不佳,因为当我尝试按产品类别过滤时它显示空记录:

SQL代码:


SELECT
    wp_posts.ID,
    CONCAT( '<a href="', wp_posts.guid, '">', wp_posts.post_title, '</a>' ) AS nazwa,
    product_taxonomy_product_cat_tbl.NAME AS kategoria,
    product_taxonomy_pa_j_m_tbl.NAME AS jednostka,
    product_quant.meta_value AS ilość,
    product_price.meta_value AS cena,
    product_weight.meta_value AS waga,
    product_sku.meta_value AS sku 
FROM
    wp_posts
    LEFT JOIN wp_postmeta product_quant ON product_quant.post_id = wp_posts.ID 
    AND product_quant.meta_key = "_stock"
    LEFT JOIN wp_postmeta product_price ON product_price.post_id = wp_posts.ID 
    AND product_price.meta_key = "_price"
    LEFT JOIN wp_postmeta product_weight ON product_weight.post_id = wp_posts.ID 
    AND product_weight.meta_key = "_weight"
    LEFT JOIN wp_postmeta product_sku ON product_sku.post_id = wp_posts.ID 
    AND product_sku.meta_key = "_sku"
    INNER JOIN (
    SELECT NAME
        ,
        object_id AS id 
    FROM
        wp_terms AS product_taxonomy_product_cat_tbl_terms
        INNER JOIN wp_term_taxonomy AS product_taxonomy_product_cat_tbl_termtaxonomy ON product_taxonomy_product_cat_tbl_termtaxonomy.term_id = product_taxonomy_product_cat_tbl_terms.term_id 
        AND product_taxonomy_product_cat_tbl_termtaxonomy.taxonomy = 'product_cat'
        INNER JOIN wp_term_relationships AS rel_product_taxonomy_product_cat_tbl ON product_taxonomy_product_cat_tbl_termtaxonomy.term_taxonomy_id = rel_product_taxonomy_product_cat_tbl.term_taxonomy_id 
    ) AS product_taxonomy_product_cat_tbl ON product_taxonomy_product_cat_tbl.ID = wp_posts.id
    INNER JOIN (
    SELECT NAME
        ,
        object_id AS id 
    FROM
        wp_terms AS product_taxonomy_pa_j_m_tbl_terms
        INNER JOIN wp_term_taxonomy AS product_taxonomy_pa_j_m_tbl_termtaxonomy ON product_taxonomy_pa_j_m_tbl_termtaxonomy.term_id = product_taxonomy_pa_j_m_tbl_terms.term_id 
        AND product_taxonomy_pa_j_m_tbl_termtaxonomy.taxonomy = 'pa_j-m'
        INNER JOIN wp_term_relationships AS rel_product_taxonomy_pa_j_m_tbl ON product_taxonomy_pa_j_m_tbl_termtaxonomy.term_taxonomy_id = rel_product_taxonomy_pa_j_m_tbl.term_taxonomy_id 
    ) AS product_taxonomy_pa_j_m_tbl ON product_taxonomy_pa_j_m_tbl.ID = wp_posts.id 
WHERE
    1 = 1 
    AND wp_posts.post_type = 'product'

如何改进代码以便按产品类别进行过滤?

代码运行见官网https://server515851.nazwa.pl/wordpress/wpn_hutniczy/o-magazynie/

想法是在页面左侧的树中按类别过滤。

这是另一种使用 WP_Query class:

按类别获取 WooCommerce 产品的方法
<?php
$cats_array = array(23); // Set here the ID of the selected category(ies)

$query_args = array(
    'posts_per_page' => 5, // How many products to show per page
    'post_type' => 'product',
    'post_status' => 'publish',
    'tax_query' => array(
        array(
            'taxonomy' => 'product_cat',
            'field' => 'id',
            'terms' => $cats_array
        )
    )
);

$products_by_category = new WP_Query($query_args);

// This category has published products, display them
if ( $products_by_category->have_posts() ) {
    ?>
    <ul class="product-list">
        <?php while ( $products_by_category->have_posts() ) : $products_by_category->the_post(); ?>
            <?php
            // Get product meta data.
            $stock = get_post_meta( get_the_ID(), '_stock', true );
            $price = get_post_meta( get_the_ID(), '_price', true );
            $weight = get_post_meta( get_the_ID(), '_weight', true );
            $sku = get_post_meta( get_the_ID(), '_sku', true );
            ?>
            <li>
                <a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
                <p>Price: <?php echo $price; ?></p>
            </li>
        <?php endwhile; ?>
    </ul>

    <div class="product-list-pagination">
        <?php 
            echo paginate_links(
                array(
                    'base'         => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),
                    'total'        => $products_by_category->max_num_pages,
                    'current'      => max( 1, get_query_var( 'paged' ) ),
                    'format'       => '?paged=%#%',
                    'show_all'     => false,
                    'type'         => 'plain',
                    'end_size'     => 2,
                    'mid_size'     => 1,
                    'prev_next'    => true,
                    'prev_text'    => sprintf( '<i></i> %1$s', __( 'Previous', 'text-domain' ) ),
                    'next_text'    => sprintf( '%1$s <i></i>', __( 'Next', 'text-domain' ) ),
                    'add_args'     => false,
                    'add_fragment' => '',
                )
            );
        ?>
    </div>

    <?php
    // Reset the global $the_post
    wp_reset_query();
} // No products found
else {
    ?>
    <p>No products found under this category.</p>
    <?php
}

$cats_array 是产品类别 ID 的数组。当用户从左侧的类别树中选择一个或多个类别时,您需要以某种方式填充此数组(通过 $_GET maybe? AJAX?您决定)。

要查看 $query_args 中的参数的作用,请查看 WP_Query documentation 以获取更多详细信息。

最后,if/else 块按类别(如果找到)呈现产品列表。当然,您可能需要更改以适应您的需要。

作为奖励,我添加了额外的代码来对结果进行分页(有关更多信息,请参阅 paginate_links())。

如果您对代码有任何疑问,请随时提出。