WP functions in .js

时间:2015-12-30 作者:N00b

我有一个巨大的main.js 其中包括我的JS + 插件\'JS. 当用户第一次访问该站点时,加载时间会稍微长一点,但它会被缓存,并且不会有任何其他内容.js 加载到其他页面。

这就产生了一个问题:我经常发现自己需要在我的.js.

我可以说出我的名字main.jsmain.php 但是它不会被缓存(至少在默认情况下是这样),而且它会花费不必要的服务器资源来处理这个文件(我最大的文件之一,目前约400KB)。

有没有人有一个很好的策略来使用WordPress函数.js 文件

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

要访问服务器端功能,需要使用从JS触发服务器事件AJAX, JSON API, XML/RPC, custom endpoints, 甚至template_redirect hooks. 一定要撒很多水nonces 执行主要功能时。

这项简单且行之有效的技术是AJAX 呼叫当AJAX接收到action 当用户登录或注销时(nopriv)。

add_action( \'wp_ajax_add_foobar\', \'prefix_ajax_add_foobar\' );
add_action( \'wp_ajax_nopriv_add_foobar\', \'prefix_ajax_add_foobar\' );

function prefix_ajax_add_foobar() {
    // Handle request then generate response using WP_Ajax_Response
}
然后通过JS触发操作。响应是您在处理程序中输出的任何内容,但通常wp_send_json_success 很好用。

jQuery.post(
    ajaxurl, 
    {
        \'action\': \'add_foobar\',
        \'data\':   \'foobarid\'
    }, 
    function(response){
        alert(\'The server responded: \' + response);
    }
);
如果JS需要在运行时访问服务器变量,请考虑使用wp_localize_script 超过文本翻译。这确实是您在加载脚本之前传递内联JS的机会。从而确保JS能够访问应用程序所需的正确URL、设置和状态。ajaxurl 对于某些人来说可能存在,但将其本地化到变量将确保它是正确的url。

// Register the script
wp_register_script( \'some_handle\', \'path/to/myscript.js\' );

// Localize the script with new data
$translation_array = array(
    \'some_string\' => __( \'Some string to translate\', \'plugin-domain\' ),
    \'a_value\' => \'10\'
);
wp_localize_script( \'some_handle\', \'object_name\', $translation_array );

// Enqueued script with localized data.
wp_enqueue_script( \'some_handle\' );

TheJSON API 也是一个很好的选择,非常容易设置。主要的缺点是,它的核心只有几个星期的时间(从4.4开始),并且没有完全建立(到4.5为止)。如果你不介意生活在边缘,你可以在短时间内与custom endpoints.

function my_awesome_func( $data ) {
    $posts = get_posts( array(
        \'author\' => $data[\'id\'],
    ) );

    if ( empty( $posts ) ) {
        return null;
    }

    return $posts[0]->post_title;
}

add_action( \'rest_api_init\', function () {
    register_rest_route( \'myplugin/v1\', \'/author/(?P<id>\\d+)\', array(
        \'methods\' => \'GET\',
        \'callback\' => \'my_awesome_func\',
    ) );
} );
<小时>XML RPC 非常酷,每个人都在切换到JSON API,如果他们可以帮助的话。这是一个经过验证的解决方案,但如今谁想要XML呢?

add_filter(\'xmlrpc_methods\', function ($methods) {
    $methods[\'myNamespace.getTotalImageCount\'] = \'rpc_myNamespace_getTotalImageCount\';
    return $methods;
});

function rpc_myNamespace_getTotalImageCount($args)
{
    return array_sum((array)wp_count_attachments(\'image\'));
}

add_action(\'parse_request\', function () {

    // PULL USER CREDS FROM CURRENT USER
    global $current_user;

    $user = $current_user->user_login;
    $password = $user->data->user_pass;

    include_once(ABSPATH . WPINC . \'/class-IXR.php\');
    include_once(ABSPATH . WPINC . \'/class-wp-http-ixr-client.php\');
    $xmlrpc_url = home_url(\'xmlrpc.php\');
    $client = new WP_HTTP_IXR_CLIENT($xmlrpc_url);

    // CALL OUR CUSTOM METHOD
    $response = $client->query(\'myNamespace.getTotalImageCount\', array(0, $user, $password));

    echo \'Response:<pre>\';
    $count = $client->message->params[0];
    print_r("{$count} total images");
    echo \'</pre>\';

    wp_die(\'FIN\');
});
如果你对应该使用多少AJAX感到好奇,那就看看WordPress的未来吧。com的pet项目Calypso 在这里,他们使用尽可能多的JS重新定义管理后端。

除非有人关闭JS,否则所有这些选项都很好,所以在构建网站时请记住这一点。

在这一过程中,也有一些工具可以提供帮助。

Postman - REST Client Chrome扩展可以测试GET和POST请求-DEMO.

Monkeyman Rewrite Analyzer WP插件可以双重检查您的自定义rewrite endpoints 工作正常。

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请