Intereting Posts
Исключить текущий идентификатор сообщения из цикла в sidepbar.php Невозможно отобразить значок с помощью get_favicon ()? Ограничить количество сообщений, которые пользователь может сделать за минуту? Каков наилучший способ установки WordPress для управления версиями и PhpStorm при одновременном разрешении обновлений Установите стандартное изображение по умолчанию для условий пользовательской таксономии Получение содержимого пользовательского типа сообщений с основного сайта Multisite Архив событий по месяцам Недопустимые символы в имени пользователя при регистрации Требуется ли $ object_type с register_taxonomy ()? WordPress устанавливает одну базу данных с двумя разными сайтами? Лучший способ исключить вывод категории для сообщений / страниц? Как отображать содержимое без страницы / сообщения Как увидеть элемент в админе с его URL-адресом? (не уверен, что это страница, сообщение или что) Добавить пользовательский WP_Query после первых 3 сообщений Установить кнопки входа / регистрации для bbPress?

Как остановить wordpress, чтобы сделать запрос по умолчанию?

Моя цель – перенаправление на пользовательский шаблон, основанный на каком-то новом правиле перезаписи, но без использования wordpress, чтобы делать неиспользуемые запросы.

мой код:

function add_rewrite_rules() { add_rewrite_rule( '^settore/([^/]*)/?$', 'index.php?settore=$matches[1]', 'top' ); add_rewrite_tag('%settore%','(caldareria|tessile)'); } add_action( 'init', 'add_rewrite_rules' ); function set_root_category_template($template){ $settore = get_query_var('settore'); if($settore != '') $template = locate_template('root-taxonomy.php'); return $template; } add_filter('template_include','set_root_category_template',99); 

Он перенаправляет правильно, но если я проверю $ wp_query-> сообщения в root-taxonomy.php, я вижу список регулярных сообщений. Вместо этого на этой странице я создам пользовательский запрос с запросом определенных данных о данных таксономии, и поэтому запрос по умолчанию абсолютно бесполезен. Как я могу остановить его? В конце концов, я не передаю запрос по умолчанию по умолчанию index.php, поэтому я не могу понять причину, по которой wp все еще выполняет запрос.

Остановить WordPress для выполнения основного запроса сложно: вам нужно копать в глубине WordPress.

Рабочий процесс WordPress:

  1. wp-blog-header.php вызовите функцию wp()
  2. Функция wp() создает экземпляр класса wp и вызывает метод main() на нем
  3. код метода main() :

     public function main($query_args = '') { $this->init(); $this->parse_request($query_args); // build query vars starting from url $this->send_headers(); $this->query_posts(); // run main query via WP_Query using built query vars $this->handle_404(); // if query has no results set 404 headers and WP_Query props $this->register_globals(); } 
  4. wp-blog-header.php включает template-loader.php который загружает файл шаблона на основе запроса

Таким образом, единственный способ остановить основной запрос – предотвратить запуск wp() .

Это можно сделать, подключив ранний крючок, сделайте то, что вам нужно, и, наконец, exit() .

Проблема такого подхода заключается в том, что предотвращение запуска wp() также предотвращает запрос анализа wp-класса, поэтому материал перезаписи, который вы добавляете, не анализируется.

Таким образом, вместо добавления тега перезаписи и правила перезаписи вам может потребоваться прямо взглянуть на URL-адрес, чтобы выбрать, будет ли он инициировать ваше пользовательское действие.

Прежде всего, давайте напишем функцию, возвращающую только относительную часть URL-адреса, например, если текущий url-файл похож на example.com/wp/path/to/somewhere?foo=bar а ваш домашний url example.com/wp/ функция возвращает path/to/somewhere :

 function get_relative_url() { $home_path = rtrim( parse_url( home_url(), PHP_URL_PATH ), '/' ); $path = trim( substr( add_query_arg( array() ), strlen( $home_path ) ), '/' ); $qs = array_keys( $_GET ); if ( ! empty( $qs ) ) { $path = remove_query_arg( $qs, $path ); } return $path; } 

Теперь мы можем использовать ранний крючок, чтобы посмотреть на URL-адрес, и только если он содержит нужный путь, мы установим переменную $settore , загрузим шаблон и $settore :

 add_action( 'wp_loaded', function() { // 'wp_loaded' hook happen before wp() is ran $path = get_relative_url(); $url_parts = explode( '/', $path ); if ( isset( $url_parts[1] ) && $url_parts[0] === 'settore' && in_array( $url_parts[1], array( 'caldareria', 'tessile' ), TRUE ) ) { // ok the current url is something like example.com/settore/tessile // and 'tessile' is in the variable $url_parts[1] $template = locate_template( 'root-taxonomy.php' ); if ( empty( $template ) ) return; // do nothing if template not found global $settore; $settore = $url_parts[1]; // in the template you can access to $settore variable. require_once $template; exit(); // prevent WordPress to do anything else } } ); 

Это все.

В приведенном выше коде, понимая, что текущий url является правильным , и установить переменную $settore было легко, потому что структура URL была простой, для более сложных структур URL- $settore вам, вероятно, понадобилось сопоставление регулярных выражений и, возможно, использовать такой инструмент, как маршрутизация Symfony компонент для соответствия URL-адресам некоторым переменным.

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

Gotchas

как вы видите, основной запрос ( global $wp_query ) в отправленном мной коде не используется, в вашем шаблоне он будет пустым объектом WP_Query , поэтому все будет ссылаться на основной запрос, например теги шаблонов, такие как is_tax() , is_archive() или такой, не будет работать.

Это применимо и к get_header() и get_footer() колонтитулу, потому что, вероятно, в вашем «root-taxonomy.php» вы будете использовать get_header() и get_footer() .

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

Возможное решение состоит в том, чтобы вручную установить основные свойства запроса, обращающиеся к global $wp_query или использовать настраиваемый заголовок, например get_header('root-tax') , для вашего настраиваемого шаблона и обработать в пользовательском теге header-root-tax.php и / или любой другой вопрос.

почему не так?

 add_action( 'pre_get_posts', 'my_post_queries' ); function my_post_queries( $query ) { if ($query->is_main_query() && !is_admin()) { // maybe check for specific page here // if (is_tax('your-taxonomy') { $query = false; remove_all_actions ( '__after_loop'); // } } } 

Или я неправильно понял вопрос?