Добрый день! Пытаюсь разобраться с AJAX+wordpress. Создал форму, скрипт и тестовую функцию. Но в сообщении alert все данные выводятся, а вот функция ничего не выводит. Функция ret находится в файле function.php дочерней темы. И если хуком ее цеплять в custom-template во фронтенде, то echo $title - не выводит полученное значение, которое отображается в alert. Просто это тестовая функция, в дальнейшем будет использоваться wp_insert_post() и она тоже сразу не публикует пост, а только после перезагрузки страницы. PHP: if(!function_exists('my_custom_script')): function my_custom_script(){ wp_enqueue_script( 'jquery' ); wp_enqueue_script('customajax', get_stylesheet_directory_uri() . '/js/custom.js', array(), 1.0,false ); wp_localize_script('customajax', 'ajjax', array( 'url' => admin_url( 'admin-ajax.php' ),)); } endif; add_action('wp_enqueue_scripts','my_custom_script'); if(!function_exists('ret')): function ret(){ $title = $_POST['titleObject']; echo $title; } endif; add_action( 'My', 'ret' ); if( defined('DOING_AJAX') ){ add_action('wp_ajax_qwas', 'ret'); add_action('wp_ajax_nopriv_qwas', 'ret'); } Код (Javascript): jQuery(function(jQuery) { jQuery('#custom_button').click(function () { jQuery.ajax({ type: "POST", dataType: 'json', data: { action: 'qwas', titleObject: 5, }, url: ajjax.url, success: function (response) { alert(response); } }); }); }); Буду благодарен за помощь.
В ajjax.url что? admin-ajax.php? Должно быть так url: '/wp-admin/admin-ajax.php', в data можно так , в общем вот пример: PHP: $('#custom_button').on('click', function() { $.ajax({ url: '/wp-admin/admin-ajax.php', type: 'POST', data: 'action=qwas&titleObject=5', success: function( data ) { alert(data) } }); }); dataType:'json' у тебя еще, его убери, ты строку возвращаешь И return не забудь, условие и лишний action убери PHP: add_action('wp_ajax_qwas', 'ret'); add_action('wp_ajax_nopriv_qwas', 'ret'); function ret(){ $title = 'нет пост данных'; if(isset($_POST['titleObject'])) { $title = $_POST['titleObject']; } echo $title; return; }
В консоли в admin-ajax.php - ответ сервера 200, Request URL: http://localhost/realty/wp-admin/admin-ajax.php. Все вышеперечисленное поменял, но в alert данные приходят. Лишний action - это хук который выводится в custom-template во фронте, поэтому я не могу его убрать, так как сама функция находится в файле function.php. Или как-то по-другому нужно выводить? На данный момент выводится "нет пост данных", но не выводится "5", хотя в сообщении alert - 50(0 добавляет вордпресс).
return уже есть, но все равно 0. Вот когда ставишь wp_die или exit - тогда нуля нет, но и во фронте ниже этого хука все исчезает.
Создай отдельные для ajax --- Добавлено --- глянь что вернет PHP: function ret(){ echo json_encode($_POST); die; }
Не совсем понял, что создать. --- Добавлено --- В alert {"action":"qwas","titleObject":"5"}0, во фронте выводит [], но все что ниже die исчезает.
В alert {"action":"qwas","titleObject":"5"}0, во фронте выводит [], но все что ниже die исчезает. Есть custom-template, который является главной страницей в нее я вставляю <?php do_action('My')?> и выводится [], а то, что ниже этого <?php do_action('My')?> исчезает (контент).
Получается ajax получает обработанные данные от сервера, но как их теперь вывести на страницах вордпресс?
Нужно, чтобы в функцию в переменную, которую я потом смогу выводить где хочу. А пока только в alert, но в переменной пусто.
На главной странице есть форма, куда передаются данные для публикации поста (пусть например там будет одно поле - "заголовок"). В function.php есть скрипт, который получает этот заголовок из $_POST и передает в функцию wp_insert_post, которая создает пост с переданным заголовком. И все это делается через ajax без перезагрузки страницы. Но сейчас, выше я написал упрощенный пример без формы и взял одно данное "5", которое по факту в функцию не передается, хотя пишет ответ 200.
@Борис-ka как не передается если вы пишите что ответ с этой функции возвращается в alert. То есть ваши данные передаются в этот скрипт. PHP: function ret(){ echo json_encode($_POST); //{"action":"qwas","titleObject":"5"} wp_die(); } если до вас не доходит, сделайте инсерт в этой функции $_POST['titleObject'] ;
В том то все и дело, что если попробовать вывести $_POST['titleObject'] (например echo $_POST['titleObject']) то ничего не выводится. Какой-то полтергейст(
А это что по вашему делает echo json_encode($_POST); ? --- Добавлено --- @Борис-ka Я кажись понял что вы тупите. Вы думаете что ajax отправили данные, и типо они там лежат, пока вам не понадобятся? Нет, php так не работает. Вы отправляете туда данные ajax они там делают то что вам надо, и возвращают вам результат. Все, они там не хранятся. --- Добавлено --- Вы отправили пост запрос в функцию ret, она делает там что то с ними и возвращает результат. В вашем случае в ваш алерт. Хотите делайте там INSER хотите UPDATE , что угодно, но это выполнится здесь и сейчас, и ничего там хранится не будет.
К примеру. Вот я отправил значение поля формы средствами ajax методом post в функцию ret, функция получила эти данные в $asd = $_POST['titleObject']. Могу я сейчас в этой функции php вывести их в echo $asd? Даже если я делаю вот так PHP: function ret() { $asd = $_POST["titleObject"]; $my_post = array( 'post_title' => $asd, 'post_type' => 'post', ); wp_insert_post( $my_post ); }; , то пост публикуется, но заголовок поста пустой. Т.е. как-будто в этой переменной $asd ничего нет. Но в alert(response) значение $asd почему то есть.
Если так вернуть, что будет? PHP: function ret() { $asd = $_POST["titleObject"]; $my_post = array( 'post_title' => $asd, 'post_content' => 'test', 'post_type' => 'post', 'post_status' => 'publish', 'post_author' => '1' ); $post_ID = wp_insert_post( $my_post ); echo $post_ID; exit(); };
Если функцию подключать так add_action('init','ret'); - то белый экран и выводится id поста. Если не добавлять action то в админке в записях ничего не происходит, а если перезагрузить страницу, то появляется новый пост, как если бы без ajax.
Попробовал без вордпресса. На сервере создал папку test в нее поместил файлы index.php в котором такой код PHP: <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Document</title> <script src="jquery-3.3.1min.js"></script> <script src="js.js"></script> </head> <body> <h1>Нажать</h1> <?php echo 'Данные приняты - '.$_POST['text']; ?> </body> </html> и файл js.js в котором такой код: Код (Javascript): $(function() { $('h1').click(function () { $.ajax({ url: 'index.php', /* Куда пойдет запрос */ method: 'post', /* Метод передачи (post или get) */ /* Тип данных в ответе (xml, json, script, html). */ data: {text: 5}, /* Параметры передаваемые в запросе. */ success: function(data){ /* функция которая будет выполнена после успешного запроса. */ console.log(data); /* В переменной data содержится ответ от index.php. */ } }); }); }); Когда нажимают "Нажать" в консоли появляется такое сообщение HTML: <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Document</title> <script src="jquery-3.3.1min.js"></script> <script src="js.js"></script> </head> <body> <h1>Нажать</h1> Данные приняты - 5 </body> </html> , т.е. ajax вроде работает. Но вот в браузере появляется ошибка: Notice: Undefined index: text in D:\Wamp\www\tost\index.php on line 12Call Stack#TimeMemoryFunctionLocation10.0008356792{main}( )...\index.php:0. Цифра 5 не выводится. Может у меня WAMP как-то неправильно работает? Я уже начинаю сходить с ума)
Ща дойдет до тебя Напиши так PHP: <?php if(isset($_POST['text'])) { echo 'Данные приняты - '.$_POST['text']; die(); } <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Document</title> <script src="jquery-3.3.1min.js"></script> <script src="js.js"></script> </head> <body> <h1>Нажать</h1> </body> </html>