Wordpress 简码条件加载

Wordpress shortcode conditional loading

我正在使用一个包含简码的 WordPress 插件。 由于外部 API 调用,这个简码很慢(执行 4 秒),我在这里需要它们,因为它们会因用户 ID 而异,正在观看页面。

实际上,我正处于插件的 development/testing 阶段。我正在尝试实现一个回退行为,它将跳过长 API 调用,如果达到特定时间,则使用本地逻辑。

我想知道,是否可以停止执行或有条件地呈现简码?使用 While 循环不是解决方案,因为它至少会循环一次。

此外,我尝试使用 set_time_limit(); PHP内置函数,但在WP环境下似乎不起作用。

此外,如果可能的话,我正在尝试在没有 AJAX 的情况下实现这一目标。如果没有,我也想要一些指南,如果你能帮助我,当然。

如果您认为我需要其他解决方案,例如不使用短代码,请告诉我。 延迟加载也可能是一种解决方案,如 thread:

我想要实现的是拥有一个异步短代码,可能带有加载程序,看起来像现代 JS Web 应用程序。

为了监控我的短代码的执行时间,我将其插入到我的函数中:

<?php
function my_function() {
  $start = microtime(true);
  // function code here
  $time_taken = microtime(true) - $start;
  wp_die( $time_taken ); // in seconds
}

由此source 谢谢,任何线索都会对我有用。

更新

根据评论提供的线索,Ajax 是必经之路。使用 wordpress register_script 和 localize_script 我成功了。

由于我调用了 Api,数据大部分时间都会发生变化,但我发现我的 js 文件正在缓存该行为,并且如果不进行硬刷新,则不会更新这些值。

如何防止浏览器或 Wordpress 对此进行缓存?

谢谢

如果时间是您最重要的因素,我会创建一个时间限制循环:

$endafter=time()+4;
$completed=false;

while(time()!=$endafter){
    echo ".";
    //Do something
    $completed=true; //Only gets reached if code before it completes successfully
    break; //will break off the while loop so your API call only runs once
}
if($completed){
    //use the API call data
}else{
    //use some other data
}

至于避免不必要的 API 调用,您可以考虑将它们缓存起来,并且仅在需要新数据时才执行 API 调用,比如在一段时间后,或者值发生变化时.我不确定用 WordPress 数据库对象实现这个的最佳方法,但我已经通过使用直接 PHP 的自定义来比较时间戳,如果它已过期,请从 API 和更新它用当前时间戳更新旧时间戳。

如果可行,请告诉我!

使用 Ajax 是解决我的问题的最佳方法,例如 post:

此外,为了防止触发 ajax 处理程序的 javascript 被缓存,必须通过 wp_register_script() https://developer.wordpress.org/reference/functions/wp_register_script/ 添加一个随机版本号。 ,例如使用 time().

<?php
wp_register_script(
    'myscript',
    MAIN_PLUGIN_DIR .'/scripts.js',
    false,
    time(), //random version number
    true);
wp_enqueue_script('myscript');
?>