wp_localize_script $ параметры данных в массиве

Я пытаюсь разработать свой первый плагин для WordPress, и для этого я хочу использовать wp_localize_script для публикации данных форм без обновления страницы.
Проблема в том, что я плохо понимаю, как настроить параметр $ data в wp_localize_script.

Больше объяснений:

  • 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 (stringified), но он пока не работает (возможно, потому что я пока не понимаю, как 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 часть
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 этот третий параметр, кажется, требуется … Так что я не понимаю …

Для информации я запустил свой скрипт на WordPress 4.4.2.

У кого-нибудь есть идеи, как мне это сделать?

Спасибо, что прочитали мой вопрос, и заранее спасибо за ваши ответы.

Cordialy,

BBFUNK01;)

2

Решение

Я не думаю, что вам нужно использовать wp_localize_script для того, что вы пытаетесь сделать.

Чтобы получить доступ к данным POST на стороне PHP, вам нужно использовать хук wp_ajax_ (действие) и / или wp_ajax_nopriv_ (действие). Первый крюк предназначен для аджакса на стороне администратора, второй — для стороны, обращенной к зрителю. Как только вы зарегистрируете свои функции одним или обоими из этих хуков, данные 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);

});

Что касается использования одноразового номера в целях безопасности (что является отличной идеей!), Вы можете поместить одноразовый номер в скрытое поле ввода. Вот пример.

Использование wp_localize_script для передачи URL-адреса admin-ajax и одноразового номера

Я думаю, что вы можете использовать wp_localize_script, чтобы передать одноразовый номер и URL-адрес ajax:

$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, читайте этот урок.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector