Как вы создаете «виртуальную» страницу в WordPress

Я пытаюсь создать пользовательскую конечную точку API в WordPress, и мне нужно перенаправить запросы на виртуальную страницу в корень WordPress на фактическую страницу, которая поставляется с моим подключаемым модулем. Таким образом, в основном, все запросы на одну страницу фактически направляются на другую.

Пример:
http://mysite.com/my-api.php => http://mysite.com/wp-content/plugins/my-plugin/my-api.php

Цель этого заключается в том, чтобы сделать URL-адрес конечной точки API максимально коротким (аналогично http://mysite.com/xmlrpc.php), но для отправки фактического файла конечной точки API с помощью плагин вместо того, чтобы требовать от пользователя перемещать файлы в своей установке и /или взломать ядро.

Мой первый удар состоял в том, чтобы добавить пользовательское правило перезаписи. Однако это имело две проблемы.

  1. Конечная точка всегда имела завершающую косую черту. Он стал http://mysite.com/my-api.php/
  2. Мое правило перезаписи применялось только частично. Он не будет перенаправлен на wp-content /plugins ..., он будет перенаправлен на index.php & wp-content /plugins .... Это приводит к тому, что WordPress отображает либо не найденную ошибку страницы, либо просто по умолчанию на главной странице.

Идеи? Предложения?

50 голосов | спросил EAMann 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 07:05:46 +0300000000amSun, 20 Feb 2011 07:05:46 +030011 2011, 07:05:46

8 ответов


50

В WordPress существует два типа правил перезаписи: внутренние правила (хранятся в базе данных и анализируются с помощью WP :: parse_request () ) и внешние правила (хранятся в .htaccess и анализируются Apache). Вы можете выбрать любой способ, в зависимости от того, сколько WordPress вам нужно в вашем вызываемом файле.

Внешние правила:

Внешнее правило легче всего настроить и следовать. Он выполнит my-api.php в вашем каталоге плагинов, не загружая ничего из WordPress.

add_action ('init', 'wpse9870_init_external');
функция wpse9870_init_external ()
{
    глобальный $ wp_rewrite;
    $ plugin_url = plugins_url ('my-api.php', __FILE__);
    $ plugin_url = substr ($ plugin_url, strlen (home_url ()) + 1);
    //Шаблон имеет префикс '^'
    //Подстановка имеет префикс «домашний корень», по крайней мере, '/'
    //Это эквивалентно добавлению его к `non_wp_rules`
    $ wp_rewrite-> add_external_rule ('my-api.php $', $ plugin_url);
}

Внутренние правила:

Внутреннее правило требует некоторой дополнительной работы: сначала мы добавляем правило перезаписи, которое добавляет запрос vars, тогда мы делаем этот запрос var public, а затем нам нужно проверить существование этого запроса var, чтобы передать элемент управления нашему файл плагина. К тому времени, когда мы это сделаем, обычная инициализация WordPress произойдёт (мы выходим прямо перед обычным почтовым запросом).

add_action ('init', 'wpse9870_init_internal');
функция wpse9870_init_internal ()
{
    add_rewrite_rule ('my-api.php $', 'index.php? wpse9870_api = 1', 'top');
}

add_filter ('query_vars', 'wpse9870_query_vars');
функция wpse9870_query_vars ($ query_vars)
{
    $ query_vars [] = 'wpse9870_api';
    return $ query_vars;
}

add_action ('parse_request', 'wpse9870_parse_request');
функция wpse9870_parse_request (& $ wp)
{
    if (array_key_exists ('wpse9870_api', $ wp-> query_vars)) {
        включить 'my-api.php';
        Выход();
    }
    вернуть;
}
ответил Jan Fabry 21 FebruaryEurope/MoscowbMon, 21 Feb 2011 16:57:32 +0300000000pmMon, 21 Feb 2011 16:57:32 +030011 2011, 16:57:32
11

Это сработало для меня. Я никогда не касаюсь API переписывания, но всегда стараюсь продвигаться по новым направлениям. Следующее работало на моем тестовом сервере для 3.0, расположенном в подпапке localhost. Я не вижу никаких проблем, если WordPress установлен в веб-корне.

Просто отпустите этот код в плагине и загрузите файл с именем «taco-kittens.php» непосредственно в папку плагина. Вам понадобится написать жесткий флеш для ваших постоянных ссылок. Я думаю, они говорят, что самое лучшее время для этого - активировать плагин.

функция taco_kitten_rewrite () {
    $ url = str_replace (trailingslashit (site_url ()), '', plugins_url ('/taco-kittens.php', __FILE__));
    add_rewrite_rule ('taco-kittens \\. php $', $ url, 'top');
}
add_action ('wp_loaded', 'taco_kitten_rewrite');

С наилучшими пожеланиями, -Mike

ответил mfields 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 09:00:23 +0300000000amSun, 20 Feb 2011 09:00:23 +030011 2011, 09:00:23
8

Любая причина не делать что-то подобное вместо этого?

http://mysite.com/?my-api=1

Затем просто подключите свой плагин к «init» и проверьте, есть ли переменная get. Если он существует, сделайте то, что должен сделать ваш плагин, и умрите ()

ответил Will Anderson 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 07:49:28 +0300000000amSun, 20 Feb 2011 07:49:28 +030011 2011, 07:49:28
3

Возможно, вы не полностью понимаете ваши вопросы, но может ли простой короткий код решить вашу проблему?

Шаги:

  1. Попросите клиента создать страницу i.e. http://mysite.com/my-api
  2. Попросите клиента добавить короткий код на этой странице, т. е. [my-api-shortcode]

Новая страница действует как конечная точка API, а ваш короткий код отправляет запросы на ваш код плагина в http://mysite.com/wp-content/plugins/my-plugin/my-api.php

(конечно, это означает, что my-api.php будет иметь короткий код)

Возможно, вы можете автоматизировать шаги 1 и 2 через плагин.

ответил rexposadas 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 11:13:21 +0300000000amSun, 20 Feb 2011 11:13:21 +030011 2011, 11:13:21
1

Я не занимался переписыванием, но, тем не менее, это, вероятно, немного грубо, но, похоже, это работает:

function api_rewrite ($ wp_rewrite) {
    $ wp_rewrite-> non_wp_rules ['my-api \ .php'] = 'wp-content /plugins /my-plugin /my-api.php';
    file_put_contents (ABSPATH. '. htaccess', $ wp_rewrite-> mod_rewrite_rules ());
}

Он работает, если вы подключите его к «generate_rewrite_rules», но должен быть лучший способ, так как вы не хотите переписывать .htaccess на каждую загрузку страницы.
Похоже, я не могу прекратить редактировать свои собственные сообщения ... скорее всего, вам стоит скорее активировать обратный вызов и ссылаться на глобальный $ wp_rewrite. А затем удалите запись из non_wp_rules и снова выведите на .htaccess при деактивизации обратного вызова.

И, наконец, запись в .htaccess должна быть немного сложнее, вы хотите только заменить там словосочетание.

ответил wyrfel 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 08:26:48 +0300000000amSun, 20 Feb 2011 08:26:48 +030011 2011, 08:26:48
1

У меня было подобное требование и я хотел создать несколько конечных точек на основе уникальных слизней, которые указывали на контент, созданный плагином.

Посмотрите источник моего плагина: https://wordpress.org /расширение /плагины /Picasa альбом-загрузчик /

Используемый метод начинается с добавления фильтра для the_posts для проверки входящего запроса. Если плагин должен его обрабатывать, создается фиктивная почта и добавляется действие для template_redirect.

Когда вызывается действие template_redirect, оно должно приводить к выведению всего содержимого страницы, которое должно отображаться, и выйти или оно должно возвращаться без генерируемого вывода. См. Код в wp_include /template-loader.php, и вы увидите, почему.

ответил Ken 9 AMpSat, 09 Apr 2011 02:22:31 +040022Saturday 2011, 02:22:31
0

Я использую другой подход, который состоит из , заставляющего домашнюю страницу загружать пользовательский заголовок, контент и шаблон страницы .

Решение очень аккуратно, так как оно может быть реализовано, когда пользователь следует дружественной ссылке, например http://example.com/ ? plugin_page = myfakepage

Очень легко реализовать и разрешить неограниченные страницы.

Код и инструкции здесь: Создать пользовательскую /поддельную /виртуальную страницу Wordpress на лету

ответил Xavi Esteve 18 Jpm1000000pmWed, 18 Jan 2012 15:50:34 +040012 2012, 15:50:34
0

Я использую подход, подобный описанному выше Xavi Esteve, который прекратил работать из-за обновления WordPress, насколько я мог сказать во второй половине 2013 года.

Здесь подробно описано: https://stackoverflow.com/questions/17960649/wordpress- плагин-генераторный виртуальные страницы, и, используя-тематический шаблон

Ключевой частью моего подхода является использование существующего шаблона, поэтому результирующая страница выглядит так, как будто это часть сайта; Я хотел, чтобы он был максимально совместим со всеми темами, надеюсь, в выпусках WordPress. Время покажет, правильно ли я!

ответил Brian C 1 MaramSat, 01 Mar 2014 09:39:01 +04002014-03-01T09:39:01+04:0009 2014, 09:39:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132