Вопрос или проблема
У меня есть базовый 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 );
Пояснение
-
ABSPATH
: Эта константа автоматически определяет путь к корневой директории вашего WordPress. Она полезна, когда вам нужно обратиться к файлам, находящимся в корне вашего сайта, независимо от того, откуда выполняется ваш код. -
Использование
file_get_contents
: При использовании полного пути сABSPATH
ваш код будет искать файлdummy_data.json
в корневой директории, где действительно должен находиться файл, а не в директорииwp-admin
.
Заключение
Попробуйте изменить ваш код, как показано выше, и это должно решить проблему с получением данных из файла. Также убедитесь, что файл dummy_data.json
доступен для чтения (проверьте права доступа к файлу). Если вам необходимо получать данные из других мест в зависимости от ситуации, использование ABSPATH
является надежным способом избежать подобных проблем с путями.