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())。
如果您对代码有任何疑问,请随时提出。
我有以下 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())。
如果您对代码有任何疑问,请随时提出。