Intereting Posts
Передача идентификатора страницы, используемого в создании метабокса в JavaScript Пользовательский тип сообщения игнорируется в запросе WordPress и Godaddy Shared Hosting – Контент безопасности / вредоносные программы Почему нефильтрованный html разрешен в пользовательских полях для роли автора / вкладчика? Можно ли назначить несколько авторов на одном пользовательском сообщении? Как проверить, находится ли я на последней странице сообщений? Как исправить неверную ссылку? Включить содержание сообщений в связанных сообщениях в поиске Reblog WordPress в другой WordPress? WordPress 4.1 поддерживает синтаксис Markdown или я должен установить плагин? Пустые «термины» в «tax_query» возвращают пустой массив wp_insert_post не вставляет строку с апострофами правильно показать все сообщения в wordpress admin crashing после опции экрана 999 Как настроить значения по умолчанию для плагина? Как я могу надежно и глобально отключить wptexturize?

Несколько постоянных ссылок для одной и той же почты

Я хотел бы иметь несколько постоянных ссылок для одного и того же основного сообщения (по причинам i18n) – например

http://www.example.com/my-custom-post-type/this-is-a-cool-article http://www.example.com/mon-type-de-poste-personnalise/cest-un-article-sympa 

Оба указывают на одну и ту же страницу. Встроенные функции WP i18n будут касаться переключения языка на самой почтовой странице. Меня больше интересует отображение URL-адресов для SEO и эстетики конечных пользователей.

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

Я думаю, что я могу сохранить вторичный slug в поле post meta, но мне нужно будет подключиться где-нибудь в маршрутизации, чтобы включить его – мне не повезло найти правильное место для перехвата? Есть ли место для захвата или более простой способ справиться с этим?

Разбор запроса обрабатывается в WP::parse_request() . После этого есть action hook parse_request который дает вам экземпляр объекта wp .

Мы предполагаем, что http://www.example.com/my-custom-post-type/this-is-a-cool-article – ваша постоянная ссылка и http://www.example.com/mon-type-de-poste-personnalise/cest-un-article-sympa заканчивается на 404. Таким образом, первое, что нужно проверить в вашем http://www.example.com/mon-type-de-poste-personnalise/cest-un-article-sympa должно быть, если объект wp находится в состоянии error / 404:

 if ( ! empty( $wp->query_vars[ 'error' ] && 404 == $wp->query_vars[ 'error' ] ) { //… } 

Изменить: я сделал ошибку: не уверен, что статус $wp всегда равен 404 на вашем URL-адресе псевдонима. Это сильно зависит от правил перезаписи вашей системы. Поэтому вам нужно напрямую проверить свой псевдоним cpt slug.

Теперь вам нужно разобрать запрос самостоятельно и найти свою мета-ценность, чтобы найти соответствующий пост:

 if ( ! empty( $wp->query_vars[ 'error' ] && '404' == $wp->query_vars[ 'error' ] ) { //look up for your post, this var should looks like // 'mon-type-de-poste-personnalise/cest-un-article-sympa' in your case: $wp->request; //eg $parts = explode( '/', $wp->request ); // your language slug $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : ''; // do your query with your meta value $slug here } 

Следующее – настроить $wp->query_vars как они выглядели бы, когда мы столкнулись с первоначальным запросом:

 if ( ! empty( $wp->query_vars[ 'error' ] && '404' == $wp->query_vars[ 'error' ] ) { //look up for your post, this var should looks like // 'mon-type-de-poste-personnalise/cest-un-article-sympa' in your case: $wp->request; //eg $parts = explode( '/', $wp->request ); // your i18n post slug $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : ''; // do your query with your meta value $slug here // and setup the WP_Post object for the matching post $matching_post; // WP_Post // if you don't find any post, return here! // unset the error flag unset( $wp->query_vars[ 'error' ] ); // your cpt slug $cpt_slug = 'my-custom-post-type'; $wp->query_vars[ $cpt_slug ] = $matching_post->post_name; $wp->query_vars[ 'post_type' ] = $cpt_slug; $wp->query_vars[ 'name' ] = $matching_post->post_name; } 

Последнее, что вам нужно сделать, – не допустить, чтобы WordPress автоматически перенаправлялся на канонический URL-адрес, удаляя функцию redirect_canonical из действия template_redirect :

 if ( ! empty( $wp->query_vars[ 'error' ] && '404' == $wp->query_vars[ 'error' ] ) { //look up for your post, this var should looks like // 'mon-type-de-poste-personnalise/cest-un-article-sympa' in your case: $wp->request; //eg $parts = explode( '/', $wp->request ); // your language slug $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : ''; // do your query with your meta value $slug here // and setup the WP_Post object for the matching post $matching_post; // WP_Post # unset the error flag unset( $wp->query_vars[ 'error' ] ); # your cpt slug $cpt_slug = 'my-custom-post-type'; $wp->query_vars[ $cpt_slug ] = $matching_post->post_name; $wp->query_vars[ 'post_type' ] = $cpt_slug; $wp->query_vars[ 'name' ] = $matching_post->post_name; # don't redirect to the canonical url remove_action( 'template_redirect', 'redirect_canonical' ); } 

Поместите последний кодовый блок в функцию и примените его к действию parse_request :

 add_action( 'parse_request', 'wpse_126309_parse_request' ); /** * @wp-hook parse_request * @param WP $wp * @return void */ function wpse_126309_parse_request( $wp ) { // the code goes here } 

Вы должны проверить этот пример (это не более чем доказательство концепции) для побочных эффектов.