插件:同步到表的AJAX查询外部接口

时间:2013-10-01 作者:Jimbo

我计划编写一个插件,将其挂接到一个外部API中,并与几个数据库表同步一些信息。

如果有,我想以最佳实践的方式做到这一点。我希望用户能够单击插件管理选项下的按钮,并通过cron作为选项手动执行。

我想这可能需要几分钟的时间,所以我们考虑使用某种按钮并附加一个操作,使用jQuery通过AJAX启动,并设置某种计时器直到完成。

出于某种原因,我正在努力思考实现这一目标的方法,并希望通过使用WP特性而不是黑客工作的最佳实践方式来获得一些指导。有一段时间我一直在关注插件开发,试图重新站稳脚跟。

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

草图/概念要向远程/外部API发出请求,请使用WP HTTP API. 更深入的示例/细节can be found in some of my answers here.

然后只需添加一个管理页面add_submenu_page()add_menu_page() 或相关功能。

最后通过添加脚本wp_register/enqueue_script()admin_enqueue_scripts-钩你开枪了 (搜索存档)调用并更新表。

使用 在插件中,这非常简单。这是一个快速模型。它显示了执行每个可能的AJAX调用所需的所有内容。我将脚本的注册和队列分割开来,这样您就可以在需要时随时随地将脚本排队。

为了安全起见,已经实施了Nonces和referer检查。它使用一个常量命名方案,这样就不会太容易混淆(尤其是对于nonce检查)。

使用共享名称的OOP构造PHP:

class WPSEexampleAJAX
{
    public $name = \'wpse\';

    public function __construct()
    {
        add_action( \'wp_loaded\', array( $this, \'scriptsRegister\' ) );
        add_action( \'admin_enqueue_scripts\', array( $this, \'scriptsEnqueue\' ) );

        // Logged in users - everybody in Admin
        add_action( "wp_ajax_{$this->name}_action", array( $this, \'ajaxCb\' ) );
        // Guests/not logged in
        add_action( "wp_ajax_nopriv_{$this->name}_action", array( $this, \'ajaxCb\' ) );
        add_action( \'admin_enqueue_scripts\', array( $this, \'scriptsLocalize\' ) );
    }

    public function scriptsRegister( $page )
    {
        $file = \'WPSEexample.js\';
        wp_register_script(
            $this->name,
            plugins_url( "assets/scripts/{$file}", __FILE__ ),
            array(
                \'jquery\',
                // \'add other possible dependencies in here\',
            ),
            filemtime( plugin_dir_path( __FILE__ )."assets/scripts/{$file}" ),
            true
        );
    }

    public function scriptsEnqueue( $page )
    {
        wp_enqueue_script( $this->name );
    }

    public function scriptsLocalize( $page )
    {
        wp_localize_script( $this->name, "{$this->name}Object", array(
            \'ajaxurl\'          => admin_url( \'admin-ajax.php\' ),
            \'_ajax_nonce\'      => wp_create_nonce( "{$this->name}_action" ),
            \'action\'           => "{$this->name}_action",
            \'post_type\'        => get_current_screen()->post_type,
            // \'foo\'              => \'bar\',
        ) );
    }

    public function ajaxCb()
    {
        $data = array_map( \'esc_attr\', $_GET );

        check_ajax_referer( $data[\'action\'] );

        // DO STUFF IN HERE

        wp_send_json_success( array(
            // \'foo\' => \'bar\',
        ) );
    }
}
JavaScript在注册的JavaScript文件中是一个实际的AJAX发送/捕获,您只需启动AJAX调用并检索结果。现在你有了不同的切入点,可以截取或捕捉到结果。该脚本实际上没有做任何事情,只是登录到控制台。这个wpseObject 已本地化的在函数调用中有一个别名,因此您可以简单地使用plugin 相反我喜欢这样做,这样我以后就可以很容易地识别本地化对象(也可以写得更短)。这只是我个人的命名惯例。

( function( $, plugin ) {
    "use strict";

        $.ajax( {
            url  : plugin.ajaxurl,
            data : {
                action      : plugin.action,
                _ajax_nonce : plugin._ajax_nonce,
                foo         : plugin.foo,
            },
            beforeSend : function( d ) {
                console.log( \'AJAX Before send\', d );
            }
        } )
            .done( function( response, textStatus, jqXHR ) {
                // console.log( \'AJAX done\', data, textStatus, jqXHR, jqXHR.getAllResponseHeaders() );
            } )
            .fail( function( jqXHR, textStatus, errorThrown ) {
                console.log( \'AJAX failed\', jqXHR.getAllResponseHeaders(), textStatus, errorThrown );
            } )
            .then( function( jqXHR, textStatus, errorThrown ) {
                console.log( \'AJAX after\', jqXHR, textStatus, errorThrown );
            } );
} )( jQuery || {}, wpseObject || {} );
有关$.ajax() 呼叫in the official jQuery documentation.

提示:确保始终使用WordPress core中的jQuery,而不使用CDN版本。否则,您可能会遇到冲突或版本过时的问题,以防用户更新核心,而不是插件。

结束

相关推荐

修改Precision_Posts链接以使用AJAX

我正在编辑wp-includes/link-template.php 文件,并希望使用Ajax将帖子加载到我的ID中#box-right. 我知道有很多插件可以使用,但我使用自己的HTML和CSS布局,包括帖子(没有将我的网站与WordPress集成)。我正在使用AJAX加载网站中某些DIV中的内容,我需要更改以下代码以将帖子加载到我的box right DIV中。return \'<a href=\"\' . previous_posts( false ) . \"\\\" $attr>\"