具有许多META_QUERY参数的WP_QUERY需要很长时间才能加载

时间:2020-07-16 作者:Asadiy4n

我有一个search form 具有wp_query争论有很多checkbox 在此表单中

问题从这里开始,当您select all 对于选项,此查询几乎需要一分钟才能完成。以前有人有过这个问题吗?

我在HTML中使用了这些代码

<form action="<?php echo site_url() ?>/wp-admin/admin-ajax.php" method="POST" id="filter">
<label> <input type="checkbox" name="real_time_antivirus" /> Real-time Antivirus </label></br>
.
.
.
<label> <input type="checkbox" name="adware_prevention" /> adware_prevention </label></br>
<button>Apply filter</button>
<input type="hidden" name="action" value="myfilter">
在函数中。php

add_action(\'wp_ajax_myfilter\', \'misha_filter_function\'); // wp_ajax_{ACTION HERE} 
add_action(\'wp_ajax_nopriv_myfilter\', \'misha_filter_function\');
 
function misha_filter_function(){
    $args = array(
        \'posts_per_page\' =>-1,
    );
    $args[\'meta_query\'] = array( \'relation\'=>\'AND\' );
    // Antivirus_featured_scaning
    if( isset( $_POST[\'real_time_antivirus\'] ) && $_POST[\'real_time_antivirus\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_scaning\',
            \'value\' => \'real_time_antivirus\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'manual_virus_scanning\'] ) && $_POST[\'manual_virus_scanning\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_scaning\',
            \'value\' => \'manual_virus_scanning\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'usb_virus_scan\'] ) && $_POST[\'usb_virus_scan\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_scaning\',
            \'value\' => \'usb_virus_scan\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'registry_startup_scan\'] ) && $_POST[\'registry_startup_scan\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_scaning\',
            \'value\' => \'registry_startup_scan\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'auto_virus_scanning\'] ) && $_POST[\'auto_virus_scanning\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_scaning\',
            \'value\' => \'auto_virus_scanning\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'scheduled_scan\'] ) && $_POST[\'scheduled_scan\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_scaning\',
            \'value\' => \'scheduled_scan\',
            \'compare\' => \'LIKE\'
        );
    // antivirus_featured_threat
    if( isset( $_POST[\'anti_spyware\'] ) && $_POST[\'anti_spyware\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'anti_spyware\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'anti_worm\'] ) && $_POST[\'anti_worm\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'anti_worm\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'anti_trojan\'] ) && $_POST[\'anti_trojan\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'anti_trojan\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'anti_rootkit\'] ) && $_POST[\'anti_rootkit\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'anti_rootkit\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'anti_phishing\'] ) && $_POST[\'anti_phishing\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'anti_phishing\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'anti_spam\'] ) && $_POST[\'anti_spam\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'anti_spam\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'email_protection\'] ) && $_POST[\'email_protection\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'email_protection\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'chat_im_protection\'] ) && $_POST[\'chat_im_protection\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'chat_im_protection\',
            \'compare\' => \'LIKE\'
        );
    if( isset( $_POST[\'adware_prevention\'] ) && $_POST[\'adware_prevention\'] == \'on\' )
        $args[\'meta_query\'][] = array(
            \'key\' => \'antivirus_antivirus_featured_threat\',
            \'value\' => \'adware_prevention\',
            \'compare\' => \'LIKE\'
        );
 

    $query = new WP_Query( $args );
谢谢你的帮助。

2 个回复
SO网友:mozboz

是的,我可以想象这个问题会是一个愚蠢的问题。

主要原因是,针对post元值的每一个额外条件都可能导致wp\\U posts表和wp\\U posts表之间的额外SQL联接,并且联接的开销可能会呈指数级增长。我很惊讶,如果你选择了所有这些选项,它甚至会在一分钟内回来。随着wp\\U Posteta表的增大,这个问题会变得更严重。

这么说,不清楚你为什么要用LIKE 此处代替= 对于比较值,除非确实需要匹配包含value 参数这可能会对速度产生很大影响LIKE 价格比= 在SQL中。

除此之外,由于此查询在WP\\U查询中的内部工作方式,您可能很难使其更快。您可能需要一个不同的数据结构,或者不使用WP\\u查询和WP\\u postmeta表的键值结构,而是做一些更自定义的事情。或者,您可以考虑限制用户可以选择的这些选项的数量。

HTH公司

SO网友:Tom J Nowell

查询速度非常慢,因为它正在根据帖子的元数据搜索帖子。使用meta_query 从根本上讲,速度很慢,而且在数据库服务器上非常沉重和昂贵。随着数据库中帖子数量的增加,速度会变得更慢。这就是为什么当站点很小时,这些查询运行得很快,但随着时间的推移,速度会变慢。

如果要存储数据以筛选或搜索帖子,请改用自定义分类法。

当您已经知道帖子ID时,可以优化Post meta以查找值。当您已经知道值时,可以优化分类法以查找帖子如果您使用ACF或Field Manager,可以告诉这些插件对这些字段使用分类法

相关推荐

Gravity Forms - RMA Count

我是Wordpress的新手,所以想知道是否有人可以帮忙?我正在通过重力表单创建一个返回表单。然而,在每个表单的顶部,我想显示一个退货表单编号,例如RMA001、RMA002等。我想这可能可以使用一些编码来完成,但不知道如何编码。请你让我知道如何做到这一点,并解释我需要在哪里添加代码。如果您能掌握简单的英语,我们将不胜感激!非常感谢!本