Intereting Posts
Влияние SEO на присвоение нового домена многосайтовому субдомену Проверьте основной запрос из шаблона Добавить скрипт в нижний колонтитул – в редакторе сообщений Отключение фильтрации HTML при импорте в WordPress Multisite Использование нескольких настроек_поле () на странице настроек 1 Невозможно изменить название сайта в wordpress Показать все сообщения на форуме Добавление настраиваемых параметров форматирования сообщений в пользовательские типы сообщений Получите медиа-URL (с изображением) с помощью wp-cli Показать все сообщения, используя страницу шаблона и цикл? Восстановление поврежденного блога WordPress Странные результаты с использованием wp-запроса с 'date_query' за последнюю неделю Как изменить миниатюру встроенного видео Youtube? get_page_by_title () не работает, если присутствуют специальные символы Как я могу заставить WordPress CPT-архивы и шаблоны страниц работать с заданными настройками постоянной ссылки?

Сделать присвоение должности определенной категории, эквивалентной присвоению ее всем категориям

Позвольте мне объяснить на примере, для ясности. Пожалуйста, найдите время, чтобы прочитать все, чтобы получить представление о том, что я точно после.

На моих сайтах категории WordPress используются Редакции, и их 4 – Категория (slug):

  • США (основной)
  • Великобритания (uk)
  • Индия (в)
  • Международный (международный)

Структура permalink – /%category%/%year%/%monthnum%/%day%/%postname%/ . При наличии этой постоянной ссылки пост, присвоенный более чем одной категории, будет доступен через любую из категорий slugs в постоянной ссылке.

Например, если должность назначена категориям США и Великобритании, она будет доступна через оба этих URL (без перенаправления):

 http://example.com/main/2013/11/01/sample-post/ http://example.com/uk/2013/11/01/sample-post/ 

Точки обзора:

  1. Постоянная ссылка будет по-прежнему включать только пул категории с самым низким ID.

  2. Если вы попытаетесь использовать пул категории, для которой сообщение не назначено, оно перенаправит обратно на постоянную ссылку. Например, эти два (примечание intl и in ):

     http://example.com/intl/2013/11/01/sample-post/ http://example.com/in/2013/11/01/sample-post/ 

    Будет перенаправляться обратно в постоянную ссылку, т.е.

     http://example.com/main/2013/11/01/sample-post/ 

Проблема. Для тех сообщений, которые я хочу показать во всех выпусках (в моем случае), я могу проверить все категории при публикации публикации. Но это может вызвать проблемы позже, когда я добавлю больше выпусков, т. Е. Старые записи не будут отображаться в новых версиях / категориях.

Поэтому я использую эту настраиваемую функцию в соответствии с моими потребностями:

 add_filter('pre_get_posts','better_editions_archive'); function better_editions_archive( $query ) { if ( $query->is_tax( 'category' ) && $query->is_main_query() ) { $query->set( 'post_type', array( 'post' ) ); $query->set( 'tax_query', array( 'relation' => 'OR', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => 'intl', 'operator' => 'IN' ) ) ); } return $query; } /* * Based on: * http://wordpress.stackexchange.com/a/90573/10691 */ 

С этой функцией на месте, когда я хочу, чтобы сообщение отображалось во всех выпусках (категориях), я могу просто назначить пост для международной (intl) категории и вуаля!

Проблема в том, что теперь сообщение доступно только через его постоянную ссылку, то есть http://example.com/intl/2013/11/01/sample-post/ .

Но я хочу, чтобы он был доступен (без перенаправления) через все категории slugs, т. Е.

 http://example.com/main/2013/11/01/sample-post/ http://example.com/uk/2013/11/01/sample-post/ http://example.com/in/2013/11/01/sample-post/ 

Причина: В каждом архиве издания (категории) я хочу, чтобы все ссылки сообщений начинались с slug конкретной категории, т. Е. Если URL-адрес архива – http://example.com/uk/ , я удостоверился, что все URL-адреса сообщений выглядят так:

 http://example.com/uk/2013/11/01/sample-post-1/ http://example.com/uk/2013/11/01/sample-post-2/ http://example.com/uk/2013/11/01/sample-post-3/ 

Для этого я использовал str_replace() , так что это понятно.


Теперь вопрос в том, что, когда должность присваивается категории International (intl) , как я могу убедиться, что она доступна без каких-либо перенаправлений через все категории, как если бы почта была назначена всем категориям ?

Точно, как я могу назначить сообщение определенной категории, эквивалентной присвоению ее всем категориям?

Один из способов решения этой проблемы – использовать фильтр redirect_canonical для отмены перенаправления (это происходит, когда категория, которой назначена должность, не соответствует категории slug в запрошенном URL-адресе почты) для сообщений, присвоенных International (intl) категория.

 /* * Related core file: wp-includes/canonical.php * * NOTE: If you see no change after adding the function, try re-saving the permalink settings. */ add_filter( 'redirect_canonical', 'itsme_redirect_canonical', 10, 2 ); function itsme_redirect_canonical( $redirect_url, $requested_url ) { global $wp_rewrite; if( is_single() && in_category( 'intl' ) && strpos( $wp_rewrite->permalink_structure, '%category%' ) !== false && $cat = get_query_var( 'category_name' ) ) { $category = get_category_by_path( $cat ); if( $category && !is_wp_error( $category ) ) { return str_replace( 'intl', $cat, $redirect_url ); // return $requested_url; /* * WHY NOT SIMPLY `return $requested_url;`? * * By returning $requested_url you're returning something that might not be * canonical (eg extra slashes, etc) and there's a possibility that the * safety rules that WordPress has in place will redirect your URL back to * the (original) canonical URL. * * For example, this will work fine: * * http://example.com/in/2013/11/02/sample-post/ * * But this: * * http://example.com/in/2013/11/02/sample-post///// * * Will redirect back to the original, canonical URL, ie, * * http://example.com/intl/2013/11/02/sample-post/ * * In order to avoid that, you'll additionally have to write some safety * rules so that a *corrected* URL, rather than simply the requested one, is * returned, in which case, you may need to use `str_replace` or `preg_replace` * to remove the extra characters, among other rules needed, if any. Now that * can get complex. * * So instead of dealing with all this mess ourselves, we are allowing * WordPress to redirect to the (original) canonical URL, and at that point, * we are replacing 'intl' (which is the category slug in the canonical URL) * with the category slug in the requested URL. */ } } return $redirect_url; } 

Функция может быть не идеальной, и в этом случае любые исправления приветствуются!

Спасибо @Zogot за эту идею , и @StephenHarris за идею и всю помощь .

Возможно, самым простым решением является save_post к save_post и если специальная переменная $ _POST установлена ​​(скажем, с помощью флажка), назначьте ее все теги, найденные в таксономии вашего издания.

Примером может быть следующее:

 add_action( 'save_post', 'assign_edition_terms' ); function assign_edition_terms( $post_id ) { if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; if ( ! current_user_can( 'edit_post', $post_id ) ) return; // Could also check on post type here. if ( ! filter_has_var( INPUT_POST, 'assign_international' ) ) return; // Get all international terms $editions = get_terms( 'edition_taxonomy', array( 'parent' => 0, // only return parent terms 'hide_empty' => false // get also terms that have no content yet. ) ); $edition_ids = array(); foreach ( $editions as $edition ) { $edition_ids[] = $edition->term_id; } // Assign all the terms wp_set_post_terms( $post_id, $edition_ids, 'edition_taxonomy' ); // You may require a rewrite flush here. } 

Затем вам больше не требуется изменять запрос, и он должен получить все преимущества расширяющегося списка терминов.