EAMann
  • 0
Гуру

Как создать quotвиртуальнуюquot страницу в WordPress

  • 0

Я пытаюсь создать настраиваемую конечную точку 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 отображает либо ошибку «страница не найдена», либо просто по умолчанию указывает на домашнюю страницу.

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

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

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

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

    add_action( 'init', 'wpse9870_init_external' );
    function wpse9870_init_external()
    {
        global $wp_rewrite;
        $plugin_url = plugins_url( 'my-api.php', __FILE__ );
        $plugin_url = substr( $plugin_url, strlen( home_url() ) + 1 );
        // The pattern is prefixed with '^'
        // The substitution is prefixed with the "home root", at least a '/'
        // This is equivalent to appending it to `non_wp_rules`
        $wp_rewrite->add_external_rule( 'my-api.php$', $plugin_url );
    }
    

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

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

    add_action( 'init', 'wpse9870_init_internal' );
    function wpse9870_init_internal()
    {
        add_rewrite_rule( 'my-api.php$', 'index.php?wpse9870_api=1', 'top' );
    }
    
    add_filter( 'query_vars', 'wpse9870_query_vars' );
    function wpse9870_query_vars( $query_vars )
    {
        $query_vars[] = 'wpse9870_api';
        return $query_vars;
    }
    
    add_action( 'parse_request', 'wpse9870_parse_request' );
    function wpse9870_parse_request( &$wp )
    {
        if ( array_key_exists( 'wpse9870_api', $wp->query_vars ) ) {
            include 'my-api.php';
            exit();
        }
        return;
    }
    
    • 0

Оставить ответ

You must login to add an answer.