Ajax: невозможно прочитать свойство типа undefined

Может ли кто-нибудь помочь мне понять это, пожалуйста? Я пытаюсь загрузить заголовок / контент сообщения WordPress (пользовательский тип сообщения) в модальном режиме, но не могу понять это правильно. Я новичок в php и ajax, поэтому я взял фрагменты кода из разных руководств и пытаюсь собрать их все вместе.

Итак, сначала я добавляю путь для локализации моего скрипта:

wp_localize_script( 'darkam_global', 'openpost', array(
    'ajaxurl' => admin_url( 'admin-ajax.php' )
));

Вот как выглядит моя функция php:

add_action( 'wp_ajax_nopriv_open_post', 'my_open_post' );
add_action( 'wp_ajax_open_post', 'my_open_post' );

function my_open_post() {
    $id = $_GET['id'];
    $post = get_post($id);

    if ($post){
        wp_send_json(array('post_title' => $post->post_title, 'post_content' => $post->post_content));
    } else {
        wp_send_json(array('error' => '1'));
    }
    wp_die();
}

и мой jQuery:

( function( $ ) {
    var $modalTrigger = $('.js-modal-trigger');

    $modalTrigger.click( open_post_js );

    function open_post_js(id) {
        jQuery.ajax({
            url: openpost.ajaxurl,
            type: 'POST',
            data: {
                id: id,
                action: 'open_post'
            },
            success: function( result ) {
                alert( result['post_title'] );
            }
        })
    }
} )( jQuery );

Когда я запускаю модальное окно, я получаю консольную ошибку: Uncaught TypeError: Cannot read property 'type' of undefined. Также результат предупреждения отображается как «undefined».

Любая помощь будет очень признательна :)

Что возвращает console.info(result);?

cabrerahector 05.09.2018 17:27

никогда не используйте alert() для чего-либо, кроме простых типов (строки / числа) - всегда используйте console.info

freedomn-m 05.09.2018 17:33

Спасибо за совет! console.info возвращает: {error: "1"}

Kai 05.09.2018 17:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
4 952
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы пробуете этот код:

header("Access-Control-Allow-Origin: *");
    header( 'Content-Type: application/json;' );
if ($post){
        wp_send_json(array('post_title' => $post->post_title, 'post_content' => $post->post_content));
    } else {
        wp_send_json(array('error' => '1'));
    }

        wp_die();

Спасибо за предложение, Куан Ли! Мне удалось заставить его работать с принятым ответом!

Kai 05.09.2018 18:09
Ответ принят как подходящий

В вашем php вы возвращаете действительный ответ {error:1}, но вы не проверяете это в своем jquery / ajax.
Так что, вероятно, это ошибка в файле php.

является не работает в php, потому что вы не передаете id.

При подключении к событию click у вас есть:

$modalTrigger.click(open_post_js)

поэтому щелчок аналогичен вызову:

open_post_js();

но ваша сигнатура функции: function open_post_js(id), поэтому она ожидает id, например:

open_post_js(1);

id затем "передается" в php, но поскольку он не передается в javascript, php его не получает, поэтому падает.


Как это исправить? Вам необходимо передать id в open_post_jsили, чтобы получить id в open_post_js, например:

function open_post_js() {
    var id=$(this).data("id");
    ...
}

потом

<div class='js-modal-trigger' data-id = "1">...</div>

Огромное спасибо за подробное объяснение @ freedomn-m! Я только что попробовал ваше предложение, и хотя я больше не получаю ошибку консоли, журнал консоли все равно возвращает: {error: “1”}, что, вероятно, означает, что он не получает идентификатор сообщения из моей функции php. Как я мог это исправить?

Kai 05.09.2018 17:50

Проверьте, что вы отправка в php. Похоже, он все еще не отправляет его (и убедитесь, что у вас есть соответствующий идентификатор для get_post

freedomn-m 05.09.2018 17:51

На самом деле это не то, что я «отправляю», а то, что я должен «получать» от php, поэтому я изменил тип ajax на GET, и теперь он работает как шарм :) Большое спасибо за вашу помощь, свобода! очень ценится!

Kai 05.09.2018 17:59

Я не знаю, как php обрабатывает параметры с GET против POST. jquery обычно отправляет данные в body для POST и в URL-адресе для GET, так что, возможно, это то, как вы читаете параметр POST. Если вы действительно получаете данные, то в любом случае лучше использовать GET.

freedomn-m 05.09.2018 18:04

Ваш PHP выглядит хорошо, проблема в том, что id в вашем JavaScript не имеет присвоенного значения.

Если идентификатор сообщения является атрибутом данных для элемента, по которому щелкают, тогда это должно работать (при условии, что атрибут данных называется data-id):

( function( $ ) {
var $modalTrigger = $('.js-modal-trigger');

$modalTrigger.click( open_post_js );

function open_post_js() {
    var id = $(this).data('id');
    jQuery.ajax({
        url: openpost.ajaxurl,
        type: 'POST',
        data: {
            id: id,
            action: 'open_post'
        },
        success: function( result ) {
            alert( result['post_title'] );
        }
    })
}
} )( jQuery );

ах, я не видел, что свобода, я дал тот же ответ передо мной

Simon Blackbourn 05.09.2018 18:08

Ваша помощь по-прежнему очень ценится! спасибо за ваш вклад, Саймон!

Kai 05.09.2018 18:13

Другие вопросы по теме