Вопрос или проблема
У меня есть скрипт PHP, работающий в WordPress, который использует WP_Query
для получения постов с одного из моих субдоменов и возвращает их в виде строки JSON. Скрипт получает данные поста только в том случае, если я вызываю его с использованием правильного субдомена.
Например, если я перейду по адресу news.example.com/api/news.php
, JSON выводится корректно, но если я перейду по адресу www.example.com/api/news.php
, он выводит только пустой массив.
Как я могу вызвать единый скрипт, который будет получать данные с субдомена, даже если я вызываю его с использованием основного домена? Или еще лучше, если я вызываю его с любого субдомена?
Почему бы вам не попробовать использовать WP API?
Затем вы могли бы получать посты из URL, например, так…
http://subdomain.example.com/wp-json/posts
Вы также можете настроить пользовательские типы записей для использования WP API и затем получать к ним доступ аналогичным образом, для этого вам нужно добавить следующее в аргументы CPT:
$args = array(
//...
'show_in_rest' => true,
'rest_base' => 'books-api',
'rest_controller_class' => 'WP_REST_Posts_Controller',
)
);
Посмотрите: http://v2.wp-api.org/extending/custom-content-types/
Вы можете даже использовать параметры WP_Query таким образом:
http://subdomain.example.com/wp-json/posts?filter[posts_per_page]=2&filter[order]=ASC
Вы могли бы использовать jQuery.getJSON() для получения данных с другого домена:
$.getJSON('http://subdomain.example.com/wp-json/posts', function (data) {
console.log(data);
});
В качестве альтернативы вы можете включить функции WordPress в любой *.php файл в любом месте на вашем сервере. Вам не обязательно запускать скрипт внутри фактической установки WP:
define('WP_USE_THEMES', false);
require('/absolute/path/to/your/httpdocs/wp-blog-header.php');
require('/absolute/path/to/your/httpdocs/wp-admin/includes/admin.php');
Просто включите заголовки, а для административных функций — admin.php. Затем вы сможете использовать WP-Query() в этом (внешнем) файле.
С уважением, Том
.
Ответ или решение
Концепция использования WP_Query для получения данных из поддомена сталкивается с определенными техническими сложностями, особенно если требуется организовать обмен данными между различными доменами или поддоменами. Рассмотрим детально, как можно решить данную задачу и сделаем это, основываясь на теориях междоменного взаимодействия в контексте WordPress.
Теория
WP_Query является мощным инструментом в WordPress, позволяющим выполнять запросы к базе данных для извлечения постов, страниц и других элементов контента. Однако, одной из его особенностей является привязанность к определённому контексту – сайту или поддомену, где он используется. Когда вы пытаетесь вызвать WP_Query с другого домена или поддомена, вы сталкиваетесь с проблемой, что данные вне контекста могут не быть доступны.
Существует несколько способов решения этой проблемы:
-
Использование WordPress REST API: Это один из самых современных и гибких подходов. REST API позволяет извлекать данные по HTTP-запросам, что легко интегрируется с любыми приложениями, будь то другой сайт, мобильное приложение или скрипт.
-
Инклюзия файлов WordPress: Другой метод заключается в использовании файлов WordPress непосредственно в PHP-скриптах, чтобы иметь возможность использовать функции WordPress вне контекста установленного сайта.
Пример внедрения
1. Использование WordPress REST API
WordPress REST API предоставляет легкий подход к извлечению данных. Вы можете настроить кастомные типы записей для их использования через API, добавив такие опции как 'show_in_rest' => true
. Пример запроса, который можно выполнить для получения данных, выглядит следующим образом:
GET http://subdomain.example.com/wp-json/wp/v2/posts
Вы также можете добавлять параметры фильтрации:
GET http://subdomain.example.com/wp-json/wp/v2/posts?per_page=5&order=asc
Для получения данных с клиентской стороны, например с помощью jQuery:
$.getJSON('http://subdomain.example.com/wp-json/wp/v2/posts', function (data) {
console.log(data);
});
2. Инклюзия файлов WordPress
Если REST API по какой-то причине не подходит, вы можете включить файлы WordPress в ваш скрипт PHP, чтобы воспользоваться WP_Query:
define('WP_USE_THEMES', false);
require('/absolute/path/to/your/site/wp-blog-header.php');
require('/absolute/path/to/your/site/wp-admin/includes/admin.php');
// Пример использования WP_Query
$query = new WP_Query(array('post_type' => 'post', 'posts_per_page' => 5));
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo get_the_title() . "\n";
}
}
wp_reset_postdata();
Применение в реальном мире
Если ваш сайт или приложение должны взаимодействовать с данными, которые находятся на поддомене, использование REST API будет наиболее рекомендуется. Это связано с тем, что REST API предлагает необработанную интеграцию, поддержку кроссдоменных запросов через CORS, а также возможность подгонки под различные форматы данных (JSON, XML), что особенно полезно для фронтенд и мобильных приложений.
Для более интегрированных систем, где необходим прямой доступ к функционалу WordPress, включая плагины и темы, метод использования инклюзии файлов может оказаться более подходящим. Это дает полный доступ ко всем возможностям WordPress.
В итоге, выбор между REST API и инклюзией файлов WordPress будет зависеть от специфики вашей задачи, требований производительности и архитектурных предпочтений. В любом случае, оба подхода предоставляют надежные и гибкие средства для работы с WP_Query в контексте междоменного взаимодействия в среде WordPress.