Видаліть користувальницьку скриньку типу публікації з URL


15

Не знайшли корисної відповіді на це. Мені відомо про конфліктні проблеми та всі проблеми, які це може спричинити, мені цікаво, якщо це МОЖЛИВО НЕ ПРАВИЛЬНО. Для цього знадобиться переписування WP, я це дуже багато знаю.

В основному, скажімо, у нас є CPT "подій". Я хочу, щоб на сторінці однієї події була URL-адреса http://domain.com/single-event-name, а НЕ http://domain.com/events/single-event-name . Будь-які ідеї, як це зробити?


Завжди хотів дізнатися про це, ніколи не думав задавати питання. Спасибі!
fischi

@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

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');

flush / recycle url rewrites, а потім відредагуйте .htaccess

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