gpt4 book ai didi

php - 如何避免 WordPress get_posts() 中自定义字段(元值)查询的 AND 条件数量限制?

转载 作者:行者123 更新时间:2023-11-29 19:05:25 26 4
gpt4 key购买 nike

我正在为 WordPress 上构建的网站构建一个搜索工具,WordPress 中的 get_posts() 函数似乎将我限制为最多 6 个 AND 子句对于元值查询,但我需要该工具来获取超过 6 个 AND 子句。

下面是返回空数组的查询示例。下面的代码 1 是我传递给 get_posts() 的数组的 print_r(),它返回一个空数组。下面的代码 2 与代码 1 相同,但我删除了一个 AND 语句,它返回一个结果。请注意,我尝试了多种组合,这只是一个示例。

为了避免疑问,我还在数据库中包含了一个应该与代码 1 匹配的帖子示例(如下代码 3),因此我认为我们可以排除查询与任何内容都不匹配的事实。这让我相信 get_posts() 只能处理元查询中最多 6 个 AND 子句。或者也许我错过了什么?我可以强制 get_posts() 使用 6 个以上的 AND 子句吗?

代码1:

Array
(
[post_type] => page
[posts_per_page] => 10000
[category_name] => active-cards
[meta_query] => Array
(
[relation] => AND
[0] => Array
(
[key] => card_purchase_rate
[value] => Array
(
[0] => 0
[1] => 46
)

[compare] => BETWEEN
[type] => NUMERIC
)

[1] => Array
(
[key] => card_balance_transfer_rate
[value] => Array
(
[0] => 0
[1] => 14
)

[compare] => BETWEEN
[type] => NUMERIC
)

[2] => Array
(
[relation] => AND
[0] => Array
(
[key] => is_rewards_card
[value] => yes
[compare] => LIKE
)

[1] => Array
(
[key] => is_air_points_card
[value] => yes
[compare] => LIKE
)

[2] => Array
(
[key] => is_frequent_flyer_card
[value] => yes
[compare] => LIKE
)

)

[3] => Array
(
[key] => card_brand
[value] => Array
(
[0] => amex
[1] => mastercard
[2] => visa
)

[compare] => IN
[type] => CHAR
)

[4] => Array
(
[key] => card_provider
[value] => Array
(
[0] => anz
[1] => asb
[2] => bnz
[3] => westpac
[4] => kiwibank
[5] => tsb
[6] => warehouse_money
)

[compare] => IN
[type] => CHAR
)

)

)

代码2:

Array
(
[post_type] => page
[posts_per_page] => 10000
[category_name] => active-cards
[meta_query] => Array
(
[relation] => AND
[0] => Array
(
[key] => card_purchase_rate
[value] => Array
(
[0] => 0
[1] => 46
)

[compare] => BETWEEN
[type] => NUMERIC
)

[1] => Array
(
[key] => card_balance_transfer_rate
[value] => Array
(
[0] => 0
[1] => 14
)

[compare] => BETWEEN
[type] => NUMERIC
)

[2] => Array
(
[relation] => AND
[0] => Array
(
[key] => is_rewards_card
[value] => yes
[compare] => LIKE
)

[1] => Array
(
[key] => is_air_points_card
[value] => yes
[compare] => LIKE
)

[2] => Array
(
[key] => is_frequent_flyer_card
[value] => yes
[compare] => LIKE
)

)

[3] => Array
(
[key] => card_brand
[value] => Array
(
[0] => amex
[1] => mastercard
[2] => visa
)

[compare] => IN
[type] => CHAR
)

)

)

代码 3(这是代码 2 返回的帖子的示例。代码 1 也应该与此项目匹配,但它不返回任何内容。

Array
(
[0] => WP_Post Object
(
[ID] => 3742
[post_author] => 1
[post_date] => 2017-01-17 20:01:36
[post_date_gmt] => 2017-01-17 09:01:36
[post_title] => Westpac Airpoints Business MasterCard Credit Card
[post_excerpt] =>
[post_status] => publish
[comment_status] => closed
[ping_status] => closed
[post_password] =>
[post_name] => westpac-airpoints-business-mastercard-credit-card
[to_ping] =>
[pinged] =>
[post_modified] => 2017-04-11 22:08:20
[post_modified_gmt] => 2017-04-11 11:08:20
[post_content_filtered] =>
[post_parent] => 0
[guid] => http://www.creditcardscompare.co.nz/?page_id=3742
[menu_order] => 0
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
[meta] => Array
(

[card_annual_fee] => Array
(
[0] => 145
)

[card_purchase_rate] => Array
(
[0] => 20.95
)


[card_balance_transfer_rate] => Array
(
[0] => 1.99
)


[card_cash_rate] => Array
(
[0] => 22.95
)


[card_interest_free_days] => Array
(
[0] => 44
)

[card_provider] => Array
(
[0] => Westpac
)

[card_brand] => Array
(
[0] => Mastercard
)


[is_rewards_card] => Array
(
[0] => a:1:{i:0;s:3:"yes";}
)

[is_low_interest_card] => Array
(
[0] =>
)

[is_no_annual_fee_card] => Array
(
[0] =>
)

[is_balance_transfer_card] => Array
(
[0] =>
)


[is_student_card] => Array
(
[0] =>
)

[is_prestige_card] => Array
(
[0] =>
)


[is_air_new_zealand_card] => Array
(
[0] =>
)

[is_air_points_card] => Array
(
[0] => a:1:{i:0;s:3:"yes";}
)

[is_frequent_flyer_card] => Array
(
[0] => a:1:{i:0;s:3:"yes";}
)

[is_airpoint_lounge_access_card] => Array
(
[0] =>
)

[is_best_card] => Array
(
[0] =>
)

[is_black_card] => Array
(
[0] =>
)

[is_business_card] => Array
(
[0] => a:1:{i:0;s:3:"yes";}
)


[is_cash_advance_card] => Array
(
[0] =>
)

[is_cash_back_card] => Array
(
[0] =>
)


[is_cheap_card] => Array
(
[0] =>
)

[is_debit_card] => Array
(
[0] =>
)

[is_flybuys_card] => Array
(
[0] =>
)

[is_gold_card] => Array
(
[0] =>
)

[is_high_income_card] => Array
(
[0] =>
)

[is_home_loan_card] => Array
(
[0] =>
)

[is_instant_approval_card] => Array
(
[0] =>
)

[is_long_term_balance_transfer_card] => Array
(
[0] =>
)

[is_low_annual_fee_card] => Array
(
[0] =>
)

[is_low_income_card] => Array
(
[0] =>
)

[is_no_foreign_transaction_fee_card] => Array
(
[0] =>
)

[is_platinum_card?] => Array
(
[0] =>
)


[is_purchase_protection_card] => Array
(
[0] =>
)


[is_qantas_card] => Array
(
[0] =>
)


[is_signup_bonus_card] => Array
(
[0] =>
)


[is_travel_insurance_card] => Array
(
[0] =>
)

[is_zero_balance_transfer_card] => Array
(
[0] =>
)


[is_zero_interest_card] => Array
(
[0] =>
)

[card_star_rating] => Array
(
[0] => 4
)

)

[post_url] => http://www.creditcardscompare.co.nz/westpac-airpoints-business-mastercard-credit-card/
)

这里要求的是WP_query SQL

SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )  INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )  INNER JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id )  INNER JOIN wp_postmeta AS mt3 ON ( wp_posts.ID = mt3.post_id )  INNER JOIN wp_postmeta AS mt4 ON ( wp_posts.ID = mt4.post_id )  INNER JOIN wp_postmeta AS mt5 ON ( wp_posts.ID = mt5.post_id )  INNER JOIN wp_postmeta AS mt6 ON ( wp_posts.ID = mt6.post_id ) WHERE 1=1  AND ( 
wp_term_relationships.term_taxonomy_id IN (78)
) AND (
( wp_postmeta.meta_key = 'card_purchase_rate' AND CAST(wp_postmeta.meta_value AS SIGNED) BETWEEN '0' AND '30' )
AND
( mt1.meta_key = 'card_balance_transfer_rate' AND CAST(mt1.meta_value AS SIGNED) BETWEEN '0' AND '13' )
AND
(
( mt2.meta_key = 'is_rewards_card' AND mt2.meta_value LIKE '%yes%' )
AND
( mt3.meta_key = 'is_air_points_card' AND mt3.meta_value LIKE '%yes%' )
AND
( mt4.meta_key = 'is_frequent_flyer_card' AND mt4.meta_value LIKE '%yes%' )
)
AND
( mt5.meta_key = 'card_brand' AND mt5.meta_value IN ('amex','mastercard','visa') )
AND
( mt6.meta_key = 'card_provider' AND mt6.meta_value IN ('anz','asb','bnz','westpac','kiwibank','tsb','warehouse_money') )
) AND wp_posts.post_type = 'page' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'future' OR wp_posts.post_status = 'draft' OR wp_posts.post_status = 'pending' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10000

最佳答案

您可以使用“WP_Query”和元数据来创建 WP 查询。

https://codex.wordpress.org/Class_Reference/WP_Query

例如:

$page_args=array(
'type' => "page",
'post_status' => 'publish',
'posts_per_page' => -1,
'caller_get_posts' => -1,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'card_balance_transfer_rate',
'value' => array( "0", "14" ),
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
)
)
);
$page_my_query = null;
$page_my_query = new WP_Query($page_args);

if( $page_my_query->have_posts() )
{

while ($page_my_query->have_posts()) : $page_my_query->the_post();
the_title();
endwhile;

}
wp_reset_query($page_my_query);

关于php - 如何避免 WordPress get_posts() 中自定义字段(元值)查询的 AND 条件数量限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43556074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com