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

Php 如何避免WordPress get_posts()中自定义字段(元值)查询的数量和条件限制?,php,mysql,wordpress,advanced-custom-fields,Php,Mysql,Wordpress,Advanced Custom Fields,我正在为一个基于WordPress的网站构建搜索工具,WordPress中的get_posts()函数似乎将我的元值查询限制为最多6个和子句,但我需要这个工具来处理远不止6个和子句 下面是一个返回空数组的查询示例。下面的代码1是返回空数组的数组的print\u r()。下面的代码2与代码1相同,但我删除了一条和语句,它返回一个结果。注:我尝试了多种组合,这只是一个例子 为免生疑问,我还提供了一个数据库中的帖子示例(如下面的代码3),该帖子应与代码1匹配,因此我认为我们可以排除查询不匹配的事实。这

我正在为一个基于WordPress的网站构建搜索工具,WordPress中的
get_posts()
函数似乎将我的元值查询限制为最多6个
子句,但我需要这个工具来处理远不止6个和子句

下面是一个返回空数组的查询示例。下面的代码1是返回空数组的数组的print\u r()。下面的代码2与代码1相同,但我删除了一条语句,它返回一个结果。注:我尝试了多种组合,这只是一个例子

为免生疑问,我还提供了一个数据库中的帖子示例(如下面的代码3),该帖子应与代码1匹配,因此我认为我们可以排除查询不匹配的事实。这让我相信
get_posts()
最多只能处理元查询中的6个
子句。或者我错过了什么?我可以强制
get_posts()
处理6个以上的
子句吗

代码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返回的post示例。代码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_查询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

您可以使用带有meta的“WP_query”创建WP查询

例如:

$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);

我在这里也遇到了元查询限制

我希望我能对你的问题投赞成票,因为限制没有很好的记录。谢谢你的贡献

你的问题让我意识到问题在于WP_查询限制了单个WP_查询中元查询子句的数量

编写自己的SQL查询是一个很好的解决方案。我决定在应用程序级别使用手动筛选,因为它是一个不依赖于性能的后端函数

解决方案:

似乎有5个元查询的限制,尽管将post状态设置为“草稿”似乎允许6个元查询,这更不寻常,可能与WP_查询的某种冲突/副作用有关

我能够删除其中一个元查询子句并手动筛选结果


要手动筛选的子句的选择应取决于哪个子句可以处理最小的数据集。

请使用元代码共享您的完整查询。Hi-Shital。谢谢您的帮助。顺便说一句,我已将WP_query SQL添加到原始帖子中,因为它太长,无法包含在评论中。我已经尝试过了,它的有效期不超过6周ted和语句。实际上get_posts()使用WP_Query()请共享您的查询请参阅添加到原始帖子中的sql查询