【问题标题】:WordPress load PHP plugin on demand with jQuery / AJAX?WordPress 使用 jQuery / AJAX 按需加载 PHP 插件?
【发布时间】:2018-03-25 11:00:33
【问题描述】:

我需要使用 jQuery / Ajax / PHP 按需加载 WordpPress 插件短代码,仅在我们按下按钮时。这是我尝试过的:

1) 我有一个带有按钮和 DIV 的 HTML 代码:

<a href="#" class="LoadBtn">Load Gallery Plugin</a>
<div id="PhotoGrid">Plugin shortcode should be loaded here</div>

2) 当我按下按钮时,以下 jQuery 代码运行。这与 PHP 文件通信并尝试将短代码“插入”到 DIV:

$(function() {
  $('.LoadBtn').on('click', function() {

    var url = "http://localhost:8888/studio/ajax.php";
    $.post(url, function(data) {
        $("#PhotoGrid").html(data).show();
    });

  });
});

3) PHP 代码:

echo do_shortcode('[wonderplugin_gridgallery id=1]');

但我遇到了错误。 在 jQuery 代码中,有一个 html(data) 字符串。也许这就是问题所在,因为短代码不是 hmtl 而是完整的插件代码?我是 PHP 新手,写什么,怎么写?

我在控制台中收到的错误消息:

  • 发送@jquery.js?ver=1.11.3:5
  • 发送@jquery.js?ver=1.11.3:5
  • ajax@jquery.js?ver=1.11.3:5
  • m.(匿名函数)@jquery.js?ver=1.11.3:5
  • (匿名)@my-custom.js
  • dispatch @jquery.js?ver=1.11.3:4
  • r.handle@jquery.js?ver=1.11.3:4

【问题讨论】:

  • 确认一下,PHP 代码取自插件开发者的网站。
  • 您需要了解服务器端和客户端代码之间的区别。只能通过重新加载加载PHP插件,或者让服务器单独生成侧面的部分
  • 那么我想要实现的目标是不可能的?我只想在用户请求时才加载到图库中 - 以加快页面速度。
  • 你能在没有任何其他 HTML 代码的情况下自行生成图库吗?
  • 用一个简单的短代码是的。如果我把它放在页面上的任何地方,它将被加载到:[wonderplugin_gridgallery id=1]

标签: javascript php jquery ajax wordpress


【解决方案1】:

从您的earlier post 我推测您的目标是通过延迟库的负载来提高速度排名。这可以通过少量的 PHP 代码很容易地完成 - 大约 25 行,但从你的 cmets 我推测你还没有获得这样做的技能水平。但是,您可以使用一个丑陋、低效的技巧来规避这个问题。 jQuery .load() function 可用于仅加载 HTML 文档的片段。

$("#PhotoGrid").load( "<url of page with gallery shortcode>", "<jQuery selector of the gallery HTML" );

服务器将发送完整的页面,jQuery .load() 函数将从该页面中使用 jQuery 选择器提取图库的 HTML,并将其插入到“#PhotoGrid”元素中。这有点低效,因为服务器构建了完整的页面并且只需要图库短代码片段。为了清楚起见,您现在需要两个页面,一个是调用 jQuery .load() 函数的初始页面,另一个是带有画廊短代码的原始页面。您的原始页面永远不会直接显示,而是用作可以从中提取画廊短代码 HTML 的来源。

事实上,由于原始页面仅用作图库 HTML 的来源,您可以通过使用自定义模板删除页眉、页脚和侧边栏并仅使用图库短代码的帖子内容来提高效率。您实际上只需要正确评估短代码的环境,不需要其他任何东西。如果你这样做,我怀疑这将与我接下来建议的解决方案一样高效。

请注意,这并不像加载页面两次那样低效,因为 .js 和 .css 文件在初始页面仅加载一次。初始页面还需要加载所有需要的 .css 和 .js 文件,因为第二次加载不会加载任何 .css 或 .js 文件。

这种技术有一个警告。如果原始 HTML 页面在 $(document).ready() 处理程序中对图库进行额外处理,那么由于此处理程序仅在文档的初始加载时运行,您还需要在该处理程序中执行任何必要的代码画廊的负载。

如果你想更有效地做到这一点,你需要编写一些棘手的 PHP 代码。主要思想是使用 AJAX 请求加载简码所在的页面,并使用操作“template_redirect”绕过正常的 WordPress 模板处理,并将其替换为对简码的评估。请注意,这不是“wp_ajax ...”操作,因为该处理不会在帖子的上下文中完成。

【讨论】:

  • 感谢 Magenta,这是一个非常详细的帮助和一个好技巧。我希望它也能帮助其他人。它也给了我一个想法:画廊可以位于一个完全精简的 WordPress 页面上的子域上,并按需加载到 iframe 中..?尽管您的技巧将确保仅使用所需的 DIV。我希望以后学习 PHP 并使用更有效的方法.. 但现在.. 我坚持 iframe 或你的想法。
  • 因为 iframe 对浏览器来说确实是一个完全不同的页面,它会再次加载所有 .css 和 .js 文件。尽管浏览器可以从浏览器缓存中检索这些,并且不需要向服务器发出另一个请求,但它仍然需要重新解析它们——这是不必要的重复工作。这当然是假设子页面和父页面使用相同的 .css 文件和 .js 文件。因此,要真正提高效率,您需要将父子 .css 和 .js 文件自定义为它们正在使用的确切内容。
  • 使用 iframe 的一个优点是它可以避免 $(document).ready() 处理程序问题。缺点是它很重,因为它为浏览器添加了另一个上下文(DOM)。
  • 洋红色,因此您最初的 jQuery 建议比 iframe 效果更好。 (iframe 与图像灯箱产生错误)。然而,jQuery 方法 - 虽然它工作正常 - 在控制台中产生黄色警告。我想知道您是否知道这可能意味着什么,我可以放心地忽略它吗?控制台消息:“[弃用] 主线程上的同步 XMLHttpRequest 已弃用,因为它对最终用户的体验产生不利影响。有关更多帮助,请查看 xhr.spec.whatwg.org。”谢谢!
  • 不,同步 XMLHttpRequest 非常糟糕,因为它会使页面无法响应用户。我有些惊讶,因为我不认为 .load() 是作为同步调用实现的——对我来说似乎不对。无论如何,因为 .load() 只是 get() 的一个便利函数,然后在响应中调用 $() 我会尝试用它替换 .load() 。但是,这里有些不对劲,因为我不认为 .load() 使用同步调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2010-11-26
  • 1970-01-01
  • 2013-08-21
相关资源
最近更新 更多