我面临着查询速度慢的问题。由于我对WP\\u查询不太熟悉,我设法用嵌套的WP\\u查询解决了我的问题。
https://it.zoetalentsolutions.com/technology-provider/aws/
在上面的分类页面URL中,您将看到课程以及每个课程都有多个时间表。所以我有两种帖子类型1。课程和;2.Course\\u时间表,每个课程都有唯一的Course\\u代码(存储在自定义字段中)。
我在上面的页面中所做的是:我使用wp\\u query获取帖子,并针对每个帖子:
// Custom WP query get_courses_in_cat
$args_get_courses_in_cat = array(
\'post_type\' => array(\'course\'),
\'post_status\' => array(\'draft\',\'publish\'),
\'posts_per_page\' => -1,
\'order\' => \'ASC\',
\'orderby\' => \'title\',
\'tax_query\' => array(
array(
\'taxonomy\' => \'course-category\',
\'field\' => \'term_id\',
\'terms\' => array($term->slug),
\'operator\' => \'IN\',
\'include_children\' => false,
),
),
);
我在上面的查询while循环中嵌套了另一个WP\\u查询,以使用唯一的course\\u代码作为元字段条件来获取course\\u时间表:
$ThisCourseCode = get_post_meta(get_the_ID(),\'course_code\',true);
// Custom WP query get_course_schedules
$args_get_course_schedules = array(
\'post_type\' => array(\'course-schedule\'),
\'post_status\' => array(\'draft\'),
\'posts_per_page\' => -1,
\'nopaging\' => true,
\'order\' => \'ASC\',
\'meta_key\' => \'startdate\',
\'orderby\' => \'meta_value\',
\'meta_query\' => array(
array(
\'key\' => \'course_code\',
\'value\' => $ThisCourseCode,
\'compare\' => \'=\',
)
)
);
这很好,但执行查询需要很长时间。
Solutions which I thought:
在按钮中存储唯一的course\\u代码,并使用jquery捕获OnClick以将course\\u代码传递给admin ajax。php并在此处运行wp\\u query,并在此处显示结果。
此ajax请求是否可以接受并行查询(如果用户单击多个按钮)?或者我一次只能通过一个请求&;是否在弹出窗口中显示结果?
请以正确的方式指导我执行此操作,如有任何答案,我们将不胜感激。谢谢
最合适的回答,由SO网友:Tom J Nowell 整理而成
有许多问题,但最大和最重要的是:
\'meta_query\' => array(
post meta表经过优化,可以在您已经知道post ID的情况下查找键/值。但是您已经询问了
WP_Query
做相反的事情。这意味着随着站点的增长,查询的成本越来越高/速度越来越慢,而数据库必须为这种类型的基本查询做大量繁重的工作。在这个问题上投入更多的硬件很少能加快速度,它只是延迟了不可避免的DB服务器崩溃。
相反,请存储course_code
在分类法中。分类法经过优化,可以在您具有已知键/值(分类法/术语)时查找帖子ID。这就是为什么类别和标记不仅仅是一个后元字段。与基于元字段的搜索/过滤帖子相比,基于分类法的搜索/过滤帖子的速度快得惊人,许多元盒插件允许您将分类法指定为目标,而不是帖子元,例如ACF。
如果您愿意,您可以将其存储在两个位置!只需查询分类即可。你的course_code
分类法也不必是公共的,隐藏的私有分类法也可以。
请记住,如果您需要按帖子的X来过滤/搜索/查询帖子,那么X应该是一种分类法。Post meta适用于您已经知道哪个帖子并希望了解更多详细信息的情况。
其他问题和注意事项:
从未设置posts_per_page
到-1
, 将其设置为一个您从未预料到的高值,事故可能也确实会发生,商业模式改变等等。即使它永远不会到达内存不足的那么多帖子,也要确保它永远不会到达,只需将其设置为一个高值,并确知它无法到达即可。您已经使用了分类归档模板,很好!然后,您丢弃了主查询,创建了一个全新的查询,该查询执行相同的操作,但参数略有不同,错误:(。如果需要更改主查询,请通过pre_get_posts
, 不要做新的。这至少会使页面速度加倍,因为所有这些工作都被丢弃了你的tax_query
要求所有具有特定术语ID的术语的帖子,但代码传递的是slug而不是ID。最后:
此ajax请求是否可以接受并行查询(如果用户单击多个按钮)?或者我一次只需要通过一个请求&;是否在弹出窗口中显示结果?
是和否,您可以在计划扩展时显示加载微调器,通过REST API端点请求计划,然后将其显示在微调器的位置。然而,这并没有避免后元查询,只是延迟了不可避免的查询。
还有一种可能不适用的解决方案,不依赖后元或分类法,而是依赖post_parent
. 这样,课程时间表发布的父项就是课程本身。这是最快的方法,但需要额外的工作