Удалить пользовательский тип сообщения из URL


15

Не нашли полезного ответа на это. Я осведомлен о проблемах конфликта и всех проблемах, которые это может вызвать, мне любопытно, возможно ли это, НЕ ПРЕДЛАГАЕТСЯ. Это потребует переписывания WP, я знаю это очень много.

В основном, скажем, у нас есть CPT «событий». Я хочу, чтобы страница отдельного события имела URL-адрес http://domain.com/single-event-name и НЕ http://domain.com/events/single-event-name . Есть идеи, как это сделать?


Всегда хотел узнать об этом, никогда не думал задавать вопрос. Благодарность!
fischi 13.12.12

@robbennet в 2015 году до сих пор не представляется законным способ сделать это со стилем.
Бен Расикот

Ответы:


9

Вот как вы можете выполнить первую часть работы - избавиться от CPT-слагов в ссылках постов (например, тип постов новостей).

function df_custom_post_type_link( $post_link, $id = 0 ) {  

    $post = get_post($id);  

    if ( is_wp_error($post) || 'news' != $post->post_type || empty($post->post_name) )  
        return $post_link;  

    return home_url(user_trailingslashit( "$post->post_name" ));  
}
add_filter( 'post_type_link', 'df_custom_post_type_link' , 10, 2 );

Теперь нужно переписать правила для «новостей», потому что вы получите ошибку 404.

Добавьте правило перезаписи следующим образом:

function df_custom_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?news=$matches[1]', 'top');
}
add_action('init', 'df_custom_rewrite_rule');

Затем нам нужно сбросить правила перезаписи, поэтому перейдите в Настройки - Постоянные ссылки и сохраните изменения.


1
Вы не должны добавлять правила перезаписи на init. Вы должны просто добавить свое правило к текущим правилам.
Chris_O

2
@Chris_O Можете ли вы уточнить? Как добавить правило в текущие правила?
Дези

После добавления этого кода все мои страницы, имеющие URL-адреса как example.com/about-us, перестали работать? Какие-нибудь решения для этого?
Рахул Гупта

4

Вы можете попробовать этот плагин ( http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ ) для удаления слага, но он будет работать, только если структура постоянных ссылок равна "/% postname % /


Именно этот плагин потрясающий! Я опытный пользователь этого плагина, и я полностью рекомендую его! вот ссылка на сайт плагина, который объясняет это подробно ultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary

Это хороший плагин, и он имеет именно ту функцию, которую я искал. Решение @bartosz предназначено специально для одного CPT, хотя вы тоже получаете общее представление о нем. Покопавшись в этом плагине, теперь все понятно, спасибо!
fischi 19.12.12

0

Вы всегда можете подключиться к «parse_request», чтобы проверить, существует ли пользовательский тип с запрошенным именем, и затем соответствующим образом изменить query_vars. Вам понадобится что-то вроде ответа @ Bartosz, чтобы дополнительно сгенерировать постоянную ссылку:

 add_filter('parse_request', "t21_parse_request" , 1, 1);

 function t21_parse_request($wbobj)
 {
      $vars = $wpobj->query_vars;
      $slug = $query_vars['pagename'];

      $posts = get_posts(array(
           "post_type" => "event",
           "post_name" => $slug
      ));

      if($posts)
      {
           //we know your "event" entry exists so we now amend the query_vars
           //first unset the 'page' and 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename'];

           //now rebuild the query_vars
           $query_vars['post_type'] = "event"; //CPT name
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug //again - this constructs the "event=myevent" query string
      }
      else
      {
           //just return $wpobj since we know that there is no "event"
           return $wpobj;
      }
 }

Однако при этом предполагается, что у вас не будет ни одного имени сообщения с тем же именем, что и имя сообщения, в противном случае сообщение никогда не будет отображаться, так как оно сначала совпадает с типом события.


0
function register_cpt_type() {
    register_post_type('cpt', array(
        'rewrite' => array("slug" => "/cpt", "with_front" => false),
    ));
}
add_action('init', 'register_cpt_type')

function cpt_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?cpt=$matches[1]', 'top');
}
add_action('after_theme_setup', 'cpt_rewrite_rule');

очистить / перезаписать URL переписывает, затем редактировать .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.