file_get_contents возвращает разные результаты в фильтрах и действиях

Вопрос или проблема

У меня есть базовый JSON файл с несколькими простыми объектами. Мой плагин предназначен для извлечения данных из этого файла (который находится в той же директории, что и основной PHP файл) и использования их для различных целей, хотя сейчас я просто пытаюсь проверить, правильно ли он получает данные. Когда вызывается file_get_contents из фильтра, все возвращается и работает как надо. Однако, когда вызывается из действия, он возвращает { “documents”: [null] } из файла. Там, где стоит null в этом ответе, на самом деле в файле много данных, но по какой-то причине он не может к ним получить доступ. Я не думаю, что это связано с моим кодом, так как я проверил, что моя строка для вызова данных идентична во всех местах. Я не могу придумать, что еще может вызывать эту проблему. Я также пробовал fopen. Результат такой же. Файл не читается должным образом.

Хуки:

    add_action('wp_ajax_search_contact_files', array($this, 'search_files_handler'));
    add_action('wp_ajax_nopriv_search_contact_files', array($this, 'search_files_handler'));

Обработчик довольно простой, просто извлекает немного переданных данных, а затем вызывает мой метод поиска. Все, что он делает сейчас, это:

    $jsonString = file_get_contents('dummy_data.json', true);
    return $jsonString;

Если я правильно вас понял, ваш dummy_data.json файл находится в корневой директории вашей страницы (в той же директории, где находятся index.php и wp-config.php), верно?

В этом случае вы можете легко получить доступ к этому файлу, указав этот путь: 'dummy_data.json' только когда ваш код выполняется из файла index.php.

Но AJAX вызовы выполняются из файла wp-admin/admin-ajax.php. Поэтому, когда вы пытаетесь открыть 'dummy_data.json' во время AJAX действия, ваш код будет пытаться открыть файл с названием dummy_data.json, размещенный в директории wp-admin, – и такого файла там нет.

Вы можете решить эту проблему, добавив ABSPATH к пути:

get_file_contents( ABSPATH . '/dummy_data.json' );

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что путь к файлу dummy_data.json при вызове AJAX-обработчика отличается от пути, используемого при вызове фильтров. Когда вы вызываете file_get_contents в обработчике AJAX, ваш код выполняется в контексте файла wp-admin/admin-ajax.php, что приводит к тому, что PHP пытается открыть файл dummy_data.json в директории wp-admin, где файл, скорее всего, отсутствует.

Решение вашей проблемы

Чтобы исправить эту ситуацию, необходимо указывать полный путь к вашему файлу dummy_data.json. Вы можете использовать глобальную константу ABSPATH, которая содержит полный путь к корневой директории вашего WordPress-сайта. Вот как вы можете сделать это:

$jsonString = file_get_contents( ABSPATH . 'dummy_data.json', true );

Пояснение

  1. ABSPATH: Эта константа автоматически определяет путь к корневой директории вашего WordPress. Она полезна, когда вам нужно обратиться к файлам, находящимся в корне вашего сайта, независимо от того, откуда выполняется ваш код.

  2. Использование file_get_contents: При использовании полного пути с ABSPATH ваш код будет искать файл dummy_data.json в корневой директории, где действительно должен находиться файл, а не в директории wp-admin.

Заключение

Попробуйте изменить ваш код, как показано выше, и это должно решить проблему с получением данных из файла. Также убедитесь, что файл dummy_data.json доступен для чтения (проверьте права доступа к файлу). Если вам необходимо получать данные из других мест в зависимости от ситуации, использование ABSPATH является надежным способом избежать подобных проблем с путями.

Оцените материал
Добавить комментарий

Капча загружается...