挂钩到函数内的init或显式调用。php

时间:2019-01-04 作者:Mohamed Omar

有时,我们需要在每个页面加载上运行一个函数,因此据我所知,有以下选项:

用钩子钩住它(说init)

因为我有这段代码,我需要一直运行它来检查条件和做一些事情,所以我添加了一些函数。像这样的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 但不会有任何改变,我开始问自己哪种做法是最佳做法。什么时候建议您选择一个而不是另一个?

1 个回复
最合适的回答,由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条帖子,就会很快失控。通过改变其工作方式,可以显著提高性能

  • 相关推荐

    OOP development and hooks

    我目前正在为Wordpress编写我的第一个OOP插件。为了帮助我找到一点结构,a boiler plate 这为我奠定了基础。在里面Main.php 有一种方法可以为管理员加载JS和CSS资产:/** * Register all of the hooks related to the admin area functionality * of the plugin. * * @since 0.1.0 * @access private