有时,我们需要在每个页面加载上运行一个函数,因此据我所知,有以下选项:
用钩子钩住它(说init
)在函数中直接调用。php时,最好使用其中一个。
因为我有这段代码,我需要一直运行它来检查条件和做一些事情,所以我添加了一些函数。像这样的php
$args = [
\'post_type\'=> \'product\',
\'numberposts\'=> -1,
\'meta_key\'=> \'hfx_datepicker\',
\'fields\' =>\'ids\',
];
$products = get_posts($args);
foreach($products as $productID){
$event = \'workshop_event_schedual_\'.$productID;
if (! has_action ( $event )) {
add_action($event, function() use($productID){
if(!get_option(\'student_expiry_set_\'.$productID)){
set_student_workshop_expiry($productID);
add_option(\'student_expiry_set_\'.$productID, true);
}
product_purchaser_notify($productID);
});
}
}
所以我想为什么不使用
init
但不会有任何改变,我开始问自己哪种做法是最佳做法。什么时候建议您选择一个而不是另一个?
最合适的回答,由SO网友:Tom J Nowell 整理而成
如果我们从表面上看你的代码,会有一些后果:
它可以在每个请求上运行,无论是页面、AJAX调用、REST API请求,甚至是XMLRPC。这是一个涉及post meta的超级昂贵的post查询,结果的数量没有上限。您正在通过post meta值过滤post查询,但这不是post meta的用途。这就是分类表的用途。如果需要按X或Y搜索帖子,那么X/Y必须是自定义分类法,否则性能会很差
schedule
is misspelt选项用于存储应存储为用户元或后元(或在本例中,作为分类术语)的数据,因此就性能而言,您已经处于一个糟糕的位置,最糟糕的是,因为functions.php
而且在任何类型的函数中,它都不能被子主题或插件覆盖或取消锁定。取而代之的是,我们只需将它挂在一个钩子上,就可以将“什么”与“什么时候”分开,并有条件地将其挂在钩子上。
例如,您可以admin_init
如果它只在后端运行。
通过钩住它,这也意味着如果需要,它可以被解开
但是看看你在这里实际做了什么,这不会扩展。作为product
帖子增加,网站速度会越来越慢(无论找到多少结果,搜索都是昂贵的)
更重要的是,这不应该发生在每个页面加载上,它应该发生在cron作业中并成批进行。
此外,通过依赖选项表来设置到期时间,选项表的大小将膨胀。由于自动加载选项在每个页面请求上的缓存和加载方式,它将很快与许多对象缓存下拉列表不兼容或速度较慢。
总而言之,我希望这对4到5种产品都能起到很好的作用,但一旦超过100条帖子,就会很快失控。通过改变其工作方式,可以显著提高性能