【问题标题】:AJAX search in WordPressWordPress 中的 AJAX 搜索
【发布时间】:2014-06-11 16:12:55
【问题描述】:

我的目标是“ajaxify”WordPress 搜索。到目前为止,我已经编写了一个 AJAX 调用,它将用户提交的查询字符串传递给我的 PHP 处理程序。我正在努力的部分是:

1 PHP 处理程序。

WordPress 已经有自己的 PHP 搜索脚本,我想使用它。我应该如何将它集成到我的 PHP 处理程序中?有没有简单的方法或者我需要自己重写搜索脚本?

2 AJAX 响应

我应该如何将搜索结果从我的 PHP 处理程序传回我的脚本?我可以将整个 HTML 作为字符串传递吗?类似echo json_encode( $html );

我意识到我的问题相当广泛,因此不需要确切的代码示例。我更需要一些关于我应该采取的方法的高级想法。

提前致谢。

【问题讨论】:

  • 如果数据传输是一个问题,我建议将数据作为 JSON 对象发送回来,而不是完整的 HTML。您将节省字节和字节。您可以使用内置的 PHP 搜索脚本功能吗?您可以撕开文件并将其代码复制/粘贴到您自己的函数中。只是从广泛的 AJAX/PHP 角度思考(来自与 vBulletin 的大量合作,并且从未使用过 WordPress)。
  • 感谢编辑!我应该发现所有格代词!感谢您的 cmets,我将研究 JSON 对象方法
  • 获取数据后,循环遍历 JSON 对象数组并使用 javascript/jQuery 创建 HTML 非常简单。这样客户端很重,因此,无论您尝试限制处理的哪一侧(传输与客户端 CPU/浏览器),都应该在哪一侧出错。
  • 关于处理完成位置的重要提示,我一定会研究以减轻服务器的负担

标签: php jquery ajax wordpress search


【解决方案1】:

Wordpress 的搜索处理程序实际上根本不是一个处理程序。它是WP_Query 类的一部分。从技术上讲,有一些特殊的方法可以解析搜索字符串并返回相关结果,但您不必对它们做任何事情。要使用 Wordpress 搜索帖子,只需将 s 参数添加到查询中,如下所示:

 $args = array(
   'post_type' => 'post',
   'posts_per_page' => -1,
   's' => 'foobar'
 );
 $query = new WP_Query($args);

 return json_encode($query);

确保您将 AJAX 写在 protected function 中,这样人们就无法在您的数据库上提交他们自己的查询。 Wordpress 会阻止 SQL 注入,但它仍然比抱歉更安全。

function SearchConstructor(value){
    function myAjaxCall(){
        $.ajax({
            // Your AJAX Call
        })
        .done(function( msg ) {
            return msg;
        });
    }

    this.get = function(){
        return myAjaxCall.call(this);
    }
};

这里是a better blog post 保护功能。

【讨论】:

  • 感谢您提供有关搜索处理程序的信息。在那种情况下,我不能在我的 PHP 处理程序中做类似global $wp_query; return json_encode( $wp_query ); 的事情吗?
  • 关于受保护的功能 - 我从没想过人们会尝试提交自己的数据库查询!你有没有机会举一个简单的例子来说明如何写一个?
  • 你当然可以使用全局查询。这可能会给您带来奇怪的结果,但是您可以尝试一下!至于受保护的功能,我会把它添加到我的答案中。
  • 我在想如果设置了s 那么全局查询会和搜索查询一样吗?如果我的 PHP 处理程序中的代码正在运行,s 将始终被设置...
  • 啊,在这种情况下不是。您正在实例化一个新查询。只要您的 AJAX 处理程序没有为全局查询对象设置任何内容(您必须明确地这样做),您实际上就不应该影响全局查询对象。
【解决方案2】:

我是Dave's WordPress Live Search的作者,所以我可以在这里帮助你一点。

您绝对应该熟悉AJAX in plugins 的首选方式。这样一来,您的代码就足够灵活,可以使用您或使用您的代码的人将来可能希望配置 WordPress 的所有不同方式。

不要仅仅使用json_encode() 来发送您的响应,而是考虑使用新的wp_send_json_successwp_send_json_error 函数来包含一些额外的状态信息,这些信息在您调试时可能会派上用场。

最后,请记住我的搜索插件是 MIT 许可的,所以请随意挖掘代码,看看我是如何做的。它可能比您要执行的操作要复杂得多,但您可能会从中获得一些指导。

祝你好运!

【讨论】:

  • wp_send_json_successwp_send_json_error 看起来很有趣 - 感谢您强调它们,我一定会在我的解决方案中使用它们。
  • 另外,现在只需检查您的插件...看起来很棒,会很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多