【问题标题】:Wordpress shortcode conditional loadingWordpress 简码条件加载
【发布时间】:2022-03-17 17:44:45
【问题描述】:

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

实际上,我正处于插件的开发/测试阶段。我正在尝试实现一种回退行为,如果达到某个时间,它将跳过长 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 谢谢,任何线索都会对我有用。

更新

使用 cmets 提供的线索,Ajax 是要走的路。使用 wordpress register_script 和 localize_script 我使它工作。

由于我调用了 Api,数据大部分时间都会发生变化,但我发现我的 js 文件,保存该行为正在被缓存,并且在没有硬刷新的情况下不会更新值。

如何防止浏览器或 Wordpress 缓存这个?

谢谢

【问题讨论】:

  • 阻止页面加载甚至四秒钟的东西是一件坏事。您应该在这里使用 AJAX。使用短代码输出一些占位符内容或“正在加载数据...”消息 - 然后让它自动触发对额外端点的 AJAX 请求,该端点发出 API 请求,将数据返回到前端,并将其插入短代码呈现的位置。 codex.wordpress.org/AJAX_in_Plugins 很好地解释了如何设置 AJAX 端点。
  • 此外,如果 API 数据不是“易失性”的,因为它在每次请求时都会发生变化,则分别。不依赖于用户特定的参数 - 考虑在这里实现一些缓存,这样您就不必在每次页面加载时都发出 API 请求。 WP 已经有一种称为 Transients 的机制来使这类事情变得更容易,developer.wordpress.org/apis/handbook/transients

标签: php ajax wordpress time shortcode


【解决方案1】:

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

$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 更新它并用当前时间戳更新旧时间戳.

让我知道这是否有效!

【讨论】:

  • 感谢您的回复,很遗憾您的解决方案至少会执行一次。这意味着页面加载时间将保持不变。如果我的 api 调用太长而无法执行(超过 1 秒),我想停止一切并做一些我知道会更快的事情。
【解决方案2】:

使用 Ajax 是解决我的问题的最佳方法,例如在这篇文章中:https://stackoverflow.com/a/13614297/18036486

此外,为了防止触发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');
?>

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2015-08-09
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多