【问题标题】:SQL query to get WooCommerce products by category is not working, what am I missing?按类别获取 WooCommerce 产品的 SQL 查询不起作用,我错过了什么?
【发布时间】:2022-01-11 18:13:01
【问题描述】:

我的以下 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类?
  • 我是初学者我要WP_Query代码
  • 好的,请检查下面的答案,如果它有助于考虑marking it as accepted

标签: mysql sql wordpress woocommerce


【解决方案1】:

这是使用 WP_Query 类按类别获取 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。当用户从左侧的类别树中选择一个或多个类别时,您需要以某种方式填充此数组(可能通过$_GETAJAX?您决定)。

要查看$query_args 中的参数做什么,请查看WP_Query documentation 了解更多详情。

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

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

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

【讨论】:

  • 是否可以修改或调整此 sql 查询以适应 WP_Query 代码?怎么做?很抱歉有大问题,但我是初学者
  • 此代码已按类别获取产品。您只需要更改类别 ID(如上所述)、HTML 输出以及可能需要的其他参数。
  • 还刚刚更新了代码,以便检索产品的元数据(价格、sku 等)。希望这会有所帮助。
  • 非常感谢,可以设置自动选择所有类别吗?非常感谢您的帮助
  • 要显示所有类别的产品,只需删除 tax_query 键及其数组,然后在需要按特定类别 ID 过滤时将其添加回来。
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 2021-04-12
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 2023-03-04
  • 2018-02-07
  • 2016-01-09
相关资源
最近更新 更多