2

我正在尝试开发我的第一个 Wordpress 插件,为此我想使用 wp_localize_script 发布表单数据而不刷新页面。问题是我不太了解如何在 wp_localize_script 中设置 $data 参数。

更多解释:

  • 1)我有一个带有数据列表的表单,每个表单都有一个复选框。

  • 2) 当我单击按钮保存检查的数据时,我尝试将它们发布到 admin-ajax.php,但我不知道如何在函数 wp_localize_script() 中设置第三个参数。

在 Wordpress Codex 的示例中,似乎必须知道第三个数据......但我不知道在单击保存按钮的那一刻检查了哪些数据。

在 Wordpress 法典上:

<?php

wp_localize_script( $handle, $name, $data );


// 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' );

?>

在我的插件中,我想通过在 json 中传递已发布的数据(字符串化)来发布一组检查过的数据,但它还不起作用(可能是因为我还不明白 wp_localize_script() 在这种情况下如何工作) .

例如,我的脚本如下所示:

-- jQuery 部分:

    // clic on the "save button"
$('#bppv_phcats_save').click(function(){

    // I load a div to show a loader ( only for the design )
    $('.bppv-loader').slideDown(150);

    // I create an empty array 
    var ph_cats = [];

    // I make a loop to check which checkbox is checked
    $('.bppv_phcat').each(function(i, obj) {

        // If current checkbox in loop is checked, I push it in the array with the data 1
        if($(this).prop('checked') === true){

            ph_cats[$(this).attr('name')] = 1;

        // Else if the current checkbox is unchecked, I push it into the array too but with the data 0
        }else{

            ph_cats[$(this).attr('name')] = 0;

        }

    });

    // I convert my array in json format and stringify this
    ph_cats = JSON.stringify($.extend({},ph_cats));

    // I test in the web console if the data looks like I want, it's ok        
    console.log(ph_cats);

    // I instanciate the variables
    var data = {
        action    : 'select_phcats',
        nonce     : bppv_phcats_obj.nonce,      // I create a nonce for more security
        ph_cats   : bppv_phcats_obj.ph_cats     // This is the data I want to retrieve in PHP
    };

    // I post the data to adamin-ajax.php
    $.post(bppv_phcats_obj.ajax_url, data, function(response){

        // I display an alert to check the response
        alert('Response : '+response);

    });

});

-- PHP part 1) 注册 .js 脚本

// I register my .js script
wp_register_script('bppv_js',BPPV_ROOT_URL.'assets/js/bppv.js',array('jquery'),'1.0',true);

// I enqueue it
wp_enqueue_script('bppv_js');

// The famous wp_localize_script() function I don't understand
wp_localize_script('bppv_js','bppv_phcats_obj',array('ajax_url' => admin_url('admin-ajax.php'), ??? ));

2)我的PHP函数来获取发布的数据

function select_phcats(){

    global $wpdb;

    $nonce = $_POST['nonce'];

    if (!wp_verify_nonce($nonce,'ajax-nonce')){ die ( 'hum… It seems there is a problem…'); }

    if(isset($_POST['ph_cats'])){

        $PHcats = json_decode($_POST['ph_cats'],true);

        $PHcats = $_POST['ph_cats'];

        echo 'YEAH! I get my json data!';

    }else{

        echo 'shit! It doesn't work!';

    }

    wp_die();

}

当然,我无法在 PHP 端获取我的数据。我试图在 wp_localize_script() 中指定第三个参数,如下所示:

wp_localize_script('bppv_js','bppv_phcats_obj',array('ajax_url' => admin_url('admin-ajax.php'),'nonce' => wp_create_nonce('ajax-nonce'),'ph_cats' => isset($_POST['ph_cats']) ? $_POST['ph_cats'] : 'no posted data'));

wp_localize_script('bppv_js','bppv_phcats_obj',array('ajax_url' => admin_url('admin-ajax.php'),'nonce' => wp_create_nonce('ajax-nonce'),'ph_cats' => $_POST['ph_cats']));

也像这样:

wp_localize_script('bppv_js','bppv_phcats_obj',array('ajax_url' => admin_url('admin-ajax.php'),'nonce' => wp_create_nonce('ajax-nonce'),'ph_cats' => $PHcats));

我试图看看这是否可以在不设置 wp_localize_script() 中的数据的情况下工作,如下所示:

wp_localize_script('bppv_js','bppv_phcats_obj',array('ajax_url' => admin_url('admin-ajax.php')));

没有什么对我有用,在网络上不同教程的几个主题中,我注意到有些人没有在 wp_localize_script() 中设置第三个参数,但在 Wordpress Codex 中,这第三个参数似乎是必需的......所以我不明白...

有关信息,我在 Wordpress 4.4.2 上运行我的脚本。

有人知道我该怎么做吗?

感谢您阅读我的问题,并提前感谢您的回复。

亲切地,

BBFUNK01 ;)

4

1 回答 1

0

我认为您不需要使用 wp_localize_script 来完成您尝试做的事情。

为了在 PHP 端访问 POST 数据,您需要使用 wp_ajax_(action) 钩子和/或 wp_ajax_nopriv_(action)。第一个钩子用于管理端 ajax,第二个钩子用于面向查看器的端。使用其中一个或两个钩子注册函数后,POST 数据将自动可用。

例如:

add_action( 'wp_ajax_select_phcats', 'select_phcats' );
add_action( 'wp_ajax_nopriv_select_phcats', 'select_phcats' );

编辑:

我明白您为什么要尝试使用 wp_localize_script。您似乎想将该对象用于 Nonce 值和 ajax_url。在管理方面,应该已经为您定义了 javascript 变量 ajaxurl。如果这是在前端,请添加:

add_action('wp_head','pluginname_ajaxurl');
function pluginname_ajaxurl() {
?>
<script type="text/javascript">
    var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
</script>
<?php
}

那么您的 ajax 请求将如下所示:

$.post(ajaxurl, data, function(response){

    // I display an alert to check the response
    alert('Response : '+response);

});

至于使用 nonce 来保证安全(这是个好主意!),您可以将 nonce 放在隐藏的输入字段中。 这是一个例子。

使用 wp_localize_script 传递 admin-ajax url 和 nonce

我认为您可以像这样使用 wp_localize_script 来传递 nonce 和 ajax url:

$nonce = wp_create_nonce( 'my-nonce' );
wp_localize_script('bppv_js','bppv_phcats_obj',array('ajax_url' =>
   admin_url('admin-ajax.php'), 'nonce'=> $nonce));

有关如何使用 wp_localize_script 的更多信息,请查看本教程。

于 2016-02-11T15:17:39.147 回答