Intereting Posts
Страница Wp-admin не найдена после копии сайта Добавить кнопку для переключения кухонной раковины Какой крючок использовать для перенаправления на основе $ post Удаление запроса на домашнюю страницу Используйте pre_get_posts для отображения результатов поиска по мета в определенном порядке Как написать тег «alt» в изображении для кода WordPress? Есть ли способ показывать только пользовательские метаданные на отдельные сообщения из определенных категорий? Страница категории не отображается Nav Walker добавить изображение Профилирование пользователей с помощью категорий Настройка WordPress для кеширования Amazon CloudFront? Создайте плагин из WordPress Изменить порядок элемента в разделе «Создать» на панели администратора. Изменение размера существующих изображений библиотеки Загрузка исходного изображения в медиа-библиотеку или папку для загрузки?

Переписать правила для персонализированного типа сообщения, прикрепленного к другому настраиваемому типу сообщений

У меня есть два пользовательских типа сообщений: назовем их location и topic . Тип пользовательского сообщения местоположения является иерархическим. Все статьи привязаны к одному месту с использованием метаданных. Если это имеет значение, тип публикации topic имеет настраиваемый мета-поле, содержащее раскрывающийся список locations которые сохраняются с помощью:

 update_post_meta( $post->ID, 'my-prefix-location', $the_location ); 

Я бы хотел переписать местоположение так, чтобы их URL-адреса были https://my.domain.tld/location/sub-location/sub-sub-location/topic/ .

Для местоположения я попытался, зарегистрировав тип сообщения, использовать следующий аргумент rewrite:

 'rewrite' => [ 'slug' => '/', 'with_front' => false, ], 

Это хорошо подходит для местоположений, но я не могу получить доступ к какой-либо из тем, даже после ручного перезаписывания правил. Если я запрошу их с /?id=100 , они перенаправляются на /topic/slug/ (это не структура URL, которую я хочу), но это приводит к 404.

Но даже если я решаю эту проблему, я понятия не имею, как переписать URL-адреса для тем, чтобы они имели структуру прикрепленного местоположения впереди.

Я думаю, мне придется add_rewrite_rule() и / или add_rewrite_endpoint() . Я никогда раньше не использовал ни одну из этих функций. Любые указатели будут оценены. Неужели я ошибаюсь?


[Добавлено]

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

 /topic/directory/to/my/location/page_name/ 

Достаточно просто добавить правило перезаписи, чтобы игнорировать все, кроме последнего параметра, и сопоставить это:

 add_rewrite_rule( 'topic/(.*)/([^/]+)/?$', 'index.php?topic=$matches[2]', 'top' ); 

И это будет хорошо работать, за исключением того, что я хочу, чтобы канонический URL-адрес имел (. *) Иерархическую структуру URL-адреса категории, к которой относится эта тема, и перенаправляет все остальные topic/*/leaf/ URL-адреса на этот.

Мне сложно понять, как это сделать, или даже если это возможно.

Solutions Collecting From Web of "Переписать правила для персонализированного типа сообщения, прикрепленного к другому настраиваемому типу сообщений"

Способ работы правил WordPress переписывает (с несколькими особыми исключениями), разные типы контента имеют свой уникальный элемент для своих URL-адресов, который позволяет WP идентифицировать, какой тип контента он ищет в базе данных, прежде чем он начнет и ищет его. Например, с учетом URL-адреса:

 /topic/one/two/three/ 

Вы не можете сказать с уверенностью, что three – это место или тема, если оба места и темы имеют один и тот же корень topic .

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

В своем первоначальном вопросе вы выразили желание удалить базу пользовательских почтовых сообщений. Ответ, который я приведу здесь, использует topic в качестве базы. Удаление, которое выдает тип сообщения page во весь микс. Вы можете работать с этим решением, но для того, чтобы просто показать вам простейшую форму, как это работает, я не собираюсь этого делать.

Шаг 1

Добавьте новый %parent_location% rewrite %parent_location% который будет заполнителем места для темы. Это происходит в действии init вместе с вашими правилами:

 add_rewrite_tag( '%parent_location%', '(.+)' ); 

Шаг 2

Зарегистрируйте свои типы сообщений. Я оставлю основные вещи и сосредоточусь на конкретных частях, которые делают эту работу. Все это происходит и в действии init . Не забудьте сбросить правила перезаписи после их добавления.

Для местоположений корневой слизень – это topic , а тип сообщения – иерархический.

 $args = array( 'rewrite' => array( 'slug' => 'topic' ), 'hierarchical' => true, // ... your other args ); register_post_type( 'location', $args ); 

По темам мы помещаем новый %parent_location% rewrite в %parent_location% . Мы будем использовать это, чтобы заменить местоположение в URL-адресе. Правила перезаписи, которые генерируются, никогда не будут сопоставляться, но это облегчает следующие шаги.

 $args = array( 'rewrite' => array( 'slug' => 'topic/%parent_location%' ), // ... your other args ); register_post_type( 'topic', $args ); 

Шаг 3

Добавьте фильтр в post_type_link чтобы менять путь местоположения для нашего %parent_location% всякий раз, когда запрашивается постоянная ссылка для этого %parent_location% . Посмотрите на комментарии, чтобы посмотреть, что происходит.

 function wpd_topic_link( $link, $post ) { // if this is a topic post if ( $post->post_type === 'topic' ) { // if there is location ID meta saved for this post under parent_location key if( $location_id = get_post_meta( $post->ID, 'parent_location', true ) ){ // query for that post to make sure it exists $location_post = get_posts( array( 'post_type' => 'location', 'p' => $location_id ) ); if( !empty( $location_post ) ){ // get the location permalink // strip out everything except the location parts of the URL // substitute that value for our %parent_location% placeholder $location_link = get_permalink( $location_post[0] ); $location_path = untrailingslashit( str_replace( home_url( '/topic/' ), '', $location_link ) ); $link = str_replace( '%parent_location%', $location_path, $link ); } } } return $link; } add_filter( 'post_type_link', 'wpd_topic_link', 20, 2 ); 

Теперь, когда вы добавляете сообщение темы и сохраняете правильный идентификатор местоположения в метатете post, вы увидите, что этот путь отражен в URL-адресе при редактировании этого сообщения.

Шаг 4

Отфильтруйте request чтобы искать любые запросы для местоположения, которые могут быть действительно темой. Прочитайте комментарии, чтобы понять, что происходит. Еще один побочный эффект, который можно отметить здесь: у вас никогда не может быть местоположения, которое также является темой.

 function wpd_locations_may_be_topics( $request ){ // if the location query var is set if( isset( $request['location'] ) ){ // location will be a parent / child hierarchy // make it an array of URL segments $parts = explode( '/', $request['location'] ); // it might be a topic only if there's more than a single segment if( count( $parts ) > 1 ){ $topic_slug = end( $parts ); $maybe_topic = get_posts( array( 'post_type' => 'topic', 'name' => $topic_slug ) ); // if a topic was returned if( !empty( $maybe_topic ) ){ // change request from location to topic unset( $request['location'] ); $request['post_type'] = 'topic'; $request['topic'] = $topic_slug; } } } return $request; } add_filter( 'request', 'wpd_locations_may_be_topics' );