Php 如何在不传递最低价格和最高价格URL的情况下激活价格过滤器
我更改了woocommerce的核心查询,并尝试基于自定义查询字符串pro_type_sws=32显示产品 现在,当我提供整个querystring时,它可以工作了 wp/?最低价格=35,最高价格=120,后期类型=产品和专业类型=32 但当我只是使用 localhost/wp/?post\u type=product&pro\u type\u sws=32 它不工作,我不知道如何在不使用小部件过滤器按钮的情况下激活pricefilter代码 简而言之,我想在产品页面上应用过滤器,这样它只显示那些与woocommerce的定制产品数据类型相关的产品 更改代码:class-wc-query.phpPhp 如何在不传递最低价格和最高价格URL的情况下激活价格过滤器,php,wordpress,woocommerce,Php,Wordpress,Woocommerce,我更改了woocommerce的核心查询,并尝试基于自定义查询字符串pro_type_sws=32显示产品 现在,当我提供整个querystring时,它可以工作了 wp/?最低价格=35,最高价格=120,后期类型=产品和专业类型=32 但当我只是使用 localhost/wp/?post\u type=product&pro\u type\u sws=32 它不工作,我不知道如何在不使用小部件过滤器按钮的情况下激活pricefilter代码 简而言之,我想在产品页面上应用过滤器,这样它只显示
if (( isset( $_GET['max_price'] ) && isset( $_GET['min_price'] )) or isset( $_GET['pro_type_sws'])) {
$matched_products = array();
$min = floatval( $_GET['min_price'] );
$max = floatval( $_GET['max_price'] );
$pro_type = $_GET['pro_type_sws'];
/*
Applying Filter based on product type query string
* If Product type query string set then render only those products which are related to given product data type.
*/
if (isset( $pro_type ) ){
// Query Update : Product type based filter applied through $pro_type query string
$matched_products_query = apply_filters( 'woocommerce_price_filter_results', $wpdb->get_results( $wpdb->prepare("
SELECT DISTINCT ID, post_parent, post_type FROM $wpdb->posts
INNER JOIN $wpdb->postmeta ON ID = post_id
LEFT JOIN wp_term_relationships AS rel ON object_id = post_id
WHERE post_type IN ( 'product', 'product_variation' ) AND post_status = 'publish' AND meta_key = %s AND meta_value BETWEEN %d AND %d AND rel.term_taxonomy_id = %d
", '_price', $min, $max, $pro_type ), OBJECT_K ), $min, $max );
}
else{
$matched_products_query = apply_filters( 'woocommerce_price_filter_results', $wpdb->get_results( $wpdb->prepare("
SELECT DISTINCT ID, post_parent, post_type FROM $wpdb->posts
INNER JOIN $wpdb->postmeta ON ID = post_id
WHERE post_type IN ( 'product', 'product_variation' ) AND post_status = 'publish' AND meta_key = %s AND meta_value BETWEEN %d AND %d
", '_price', $min, $max ), OBJECT_K ), $min, $max );
}
if ( $matched_products_query ) {
foreach ( $matched_products_query as $product ) {
if ( $product->post_type == 'product' )
$matched_products[] = $product->ID;
if ( $product->post_parent > 0 && ! in_array( $product->post_parent, $matched_products ) )
$matched_products[] = $product->post_parent;
}
}
更改核心文件从来都不是一个好主意,在每次更新时(WC每年都有很多更新),您必须再次应用您的MOD 尝试挂接同一个过滤器(在自定义插件或主题的
functions.php
)并执行以下操作:
add_filter( 'loop_shop_post_in', function(){
if (
( isset( $_GET['max_price'] ) && isset( $_GET['min_price'] ) )
or isset( $_GET['pro_type_sws'] )
){
// do your thing
// adjust the issets to integrate to WC behavior
// etc
}
});
我们可以看到您的自定义查询代码吗?@rnevius请现在检查,但只有当我传递完整的URL时才会激活,但是否有其他合适的方式,以便我可以使用localhost/wp/?post\u type=product&pro\u type\u sws=32,所以我只需传递pro\u type\u sws=32查询字符串并激活价格过滤器,您可以再填充一点吗,这样我就可以知道如何激活将参数传递给问题中提到的同一个查询,这样我就不必更改核心。我没有任何可以测试这个的设置。我的建议是恢复你的WC核心文件,并开始测试你的确切代码(和变体),看看会发生什么。任何想法或伪将参数传递给woo commerce筛选器或任何指向设置自定义筛选器的链接,以便我仔细阅读