外部API调用并为访问者进入的任何页面、页面主页、页面、单页等创建全局变量

时间:2020-05-04 作者:Kap40

我对wordpress完全陌生,所以如果你对我的问题不完全清楚,请原谅。。。

我想为我的网站实现以下场景,案例是调用外部api并获得一些依赖于访问者的数据。

在begging中,我添加了一个自定义函数add_action(\'init,\'function_name\',1) 我在functions.php

我将api的数据设置为全局数据,并成功地在站点的适当位置使用它们。但在检查信用使用情况后,我发现functions.php 为单个页面运行多次。

添加后error_log(debug_backtrace()[1][\'file\'])functions.php 它显示了文件的功能。php被多次调用,这源于wp-confing.php 生产线:require_once( ABSPATH . \'wp-settings.php\' );

对于临时解决方案,我已禁用add_action(\'init\'....) 并将函数的运行添加到每种类型的页面(主页、单页等),但据我所知,这不是一个合适的解决方案。

The code I was using was :

    add_action(\'init\',fuctionname,1);
    function fuctionname(){
       global $data;
       //have tried with the !isset() but as functions.php 
       //is called multiple times this wont work and credits will be used
       // Api call
       $data_api= $api_object->value1;
    }
因此,我的问题是:

为什么要使用这些功能。主题的php加载了这么多次?我应该去哪里看看

1 个回复
SO网友:Tom J Nowell

为什么是功能。主题的php加载了这么多次?我应该去哪里看看?

It doesn\'t, that\'s not how WP themes work. 如果手动加载functions.php 那就是为什么,但你不应该那样做。

WP负载functions.php 每个HTTP请求一次。请记住,浏览器可能会发出多个请求。E、 它可能会加载页面,然后用javascript发出AJAX请求。因此,如果您加载站点,并且站点发出5个AJAX调用,那么这是6个请求,而不是1个请求,所以functions.php WP老化6次。

我唯一能想到的另一件事是,你已经修改了WordPress本身,以获得你想要的更改,永远不要这样做。使用主题插件操作和过滤器来更改WordPress的行为。

哪种方法是执行我描述的场景的正确方法?当用户/访问者进入站点时运行一次功能

您需要留下某种指示,表明访问者以前去过那里,也就是cookie。

我已经将这个问题的最后一部分分解为它自己的内容,因为它表明您对PHP程序的工作方式有一个根本性的误解。

然后使用全局变量或会话变量

PHP会话是一个坏主意,因为它仍然在用户端涉及一个cookie,所以它不会绕过cookie规则。它在许多主机上也不起作用,因为它们要么关闭此功能,要么缓存和优化不兼容。

那么为什么不使用全局变量呢

因为PHP不是这样工作的。PHP程序不像在后台运行的节点或Java CMS。没有持久的程序。

每次您发出请求时,都会启动一个PHP进程,from scratch, 每个请求都是一张白纸。存储在PHP中的变量将不可用,所有文件都将加载。

WordPress将通过对如何从数据库加载内容、为持久性存储提供API等方面保持智能来缓解这一问题。如果你有memcached或Redis服务器,你可以安装一个可以大大提高性能的对象缓存,但你不能只声明一个变量有一个值,然后期望它在下一个页面加载时仍有该值。在请求结束时,程序结束,所有内容都被清除。

那么什么是global PHP中的变量

这个global 关键字是一种使变量在任何地方都可用而无需任何结构的方法。这是一种从稀薄的空气中提取东西的粗糙方法,可能会导致很多问题。这也不仅仅是PHP应用程序的一个特性,全局状态的祸害在许多编程语言中都是众所周知的。看看谷歌关于全球状态的清洁代码讲座,了解恐怖和危险。

您还将注意到,一些WP开发人员是“Singleton”的忠实粉丝。这是当他们把东西放在一个类中,这样看起来像是面向对象的,但实际上不是。然后他们给它一个静态方法,这样他们就可以像global 变量这是众所周知的反模式和不良做法。

那你该怎么办

这取决于你在做什么,你的问题非常简单。

If you want to know if a user has visited the site before:

<如果没有设置cookie,则设置cookie如果没有设置cookie,则他们以前从未到过这里。如果设置了cookie,则这不是他们第一次访问,但这都不是WordPress,对于所有CMS和语言都是相同的答案。

请注意,这并非万无一失,任何人都可以:

在匿名模式下访问,关闭浏览器中的Cookie,发送GDPR请求,要求您在其上拥有的所有数据,并且要删除这些数据,请使用其他人的设备

As for making a remote API request:

<不要在前端使用PHP,这会使您的站点速度非常慢,因为它必须等待远程服务器,然后才能用页面回复用户major 因此,SEO成功了,请使用javascript进行操作。这就是谷歌分析处理事情的方式<如果用户以前访问过该站点,这将为测试打开其他选项,例如检查本地存储而不是使用cookie。这会大大加快速度,如果操作正确,服务器将永远无法匹配此速度。前端javascript不需要与WordPress有任何关系,因此,您不必将您的研究或帮助局限于WP

相关推荐

Div-Wrap with Functions.php in ChildTheme Using Shorcode!

我只想为一个简单样式的DIV包装器创建一个短代码。在WordPress的网站上,我想添加如下内容:[quotehead]Headline text[/quotehead] ...a normal blockquote from wordpress... 输出应为:<div class=\"block_header\">Headline text</div> 我的内部功能functions.php (在childtheme中)包含以下内容:/**