Додайте розширення .html (крапка HTML) до спеціальних типів публікацій


10

Чи можна додати .htmlрозширення до спеціальних типів публікацій без плагіна ?

Для публікацій, які я можу використовувати /%postname.htmlв налаштуваннях постійної посилання

Для сторінок я можу використовувати:

add_action('init', 'change_page_permalink', -1);
function change_page_permalink() {
    global $wp_rewrite;
    if ( strstr($wp_rewrite->get_page_permastruct(), '.html') != '.html' ) 
        $wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
}

Для спеціальних типів публікацій ???

Чи є якийсь фрагмент коду, подібний до вищевказаного, який дозволяє мені змінити або додати .htmlв спеціальний URL-адресу типу публікації?


5
Просто цікаво, з якої причини ви хочете додати .html?
Вінс Петтіт

Ну, function post-type_permalinkвикине помилку. Якщо ви не отримаєте цю помилку, ви маєте щось болісно не так у налаштуваннях налагодження. Також, будь ласка, переробіть своє запитання з правильними намірами у рядках. Дякую.
кайзер

@kaiser, просто знати, як я можу використовувати ті самі налаштування постійної посилання для користувацьких типів публікацій. Якщо я встановлю /$postname.htmlдля публікацій, як я можу використовувати те саме для користувацьких типів публікацій.
user983248

Ви не прочитали жодного рядка, про який я написав у своєму коментарі, правда? Виправте свій код. Також -не працює у назвах функцій ...
kaiser

@kaiser Так, але я не Flash, і у мене проблема з руками, тому я не можу вводити текст, як я думаю або говорю
user983248

Відповіді:


8

Це, здається, працює:

Створіть правила перезапису на кшталт post-type/post-name.html. Ви можете використовувати масиви для створення правил лише для деякого набору типів публікацій, а не робити їх для всіх.

add_action( 'rewrite_rules_array', 'rewrite_rules' );
function rewrite_rules( $rules ) {
    $new_rules = array();
    foreach ( get_post_types() as $t )
        $new_rules[ $t . '/([^/]+)\.html$' ] = 'index.php?post_type=' . $t . '&name=$matches[1]';
    return $new_rules + $rules;
}

Відформатуйте нову структуру постійної посилання для цих типів публікацій.

add_filter( 'post_type_link', 'custom_post_permalink' ); // for cpt post_type_link (rather than post_link)
function custom_post_permalink ( $post_link ) {
    global $post;
    $type = get_post_type( $post->ID );
    return home_url( $type . '/' . $post->post_name . '.html' );
}

А потім перестаньте перенаправляти канонічні URL-адреси, щоб видалити проділ. Для цього може знадобитися ще трохи роботи, оскільки ви, ймовірно, захочете зберегти перенаправлення в більшості випадків.

add_filter( 'redirect_canonical', '__return_false' );

Як говорили інші тут, після виконання вищесказаного вам потрібно буде детально проправити правила, і це можливо, відвідавши сторінку options-permalink.phpадміністратора в Dashboard -> Settings -> Permalinks.


6
Ой Вініцій, хороша практика відповіді - це префіксація всіх імен функцій за допомогою wpse_59024_ (ID питання), щоб уникнути конфліктів копіювання / пасти;). . . І має додаткову користь дізнатися, який відповідь відповідає, що цей код належить до нашої бібліотеки фрагментів. . . . . +1 На місці!
brasofilo

Цей код замінить будь-які інші фільтри, які використовують post_type_linkфільтр
Tom J Nowell

4

Ви можете додати для цього правило перезапису, яке заміняє вбудовані постійні посилання, наприклад, для спеціальної пошти типу "продукт" ...

add_action('init', 'add_html_ext_to_custom_post_types');
function add_html_ext_to_custom_post_types() {
    add_rewrite_rule('^product/([^/]+)\.html', 'index.php?product=$matches[1]', 'top');
}

(Не забудьте допрацювати свої правила, повторно зберігаючи свої постійні посилання або використовуючи flush_rulesспосіб @toscho, зазначений вище).

Коваджі

  • Я не думаю, що такі функції, як the_permalink()це, використовували б це, тому вам, можливо, доведеться додати фільтр для post_linkлову цих посилань. Ви також можете додати до redirect_canonicalфільтра, щоб переспрямувати постійні посилання за замовчуванням, щоб / product / foo та / product / foo / перенаправити на /product/foo.html.
  • Вам потрібно буде додати додаткові переписування для інших URL-адрес, якими користувався ваш сайт, наприклад URL-адрес каналів, наступних сторінок, зворотних зворотів тощо. Код, наведений вище, просто працюватиме для основної сторінки користувальницького типу публікації.

2

Якщо ви віддаєте перевагу плагіну WordPress, щоб впоратися з вашою роботою, перегляньте користувальницькі постійні посилання типу публікації у сховищі плагінів WordPress. Тестується на WordPress 3.4.1, і він працює бездоганно.

Після активації плагіна просто перейдіть до панелі інструментів -> Налаштування -> Постійні посилання. Ви можете додати певні переписування для кожного зареєстрованого користувацького типу публікації.


3
Не стирайте правила перезапису на кожному завантаженні сторінки.
fuxia

цей код не працює, також якщо ви просто копіюєте та вставляєте код з xplus3.net/2010/05/20/wp3-custom-post-type-permalinks, переконайтеся, що він працює так, як очікувалося -1 для не тестування
user983248

@toscho, як ти вважаєш це зробити чи припинити це?
user983248

1
flush_rules()слід викликати де / активацію лише тому, що це дуже повільно. Ви можете перевірити, $GLOBALS['wp_rewrite']->rulesчи правила вже відомі.
fuxia

@Michael Ecklund Це дає 404, я не працюю. Ви перевірили цей код?
user983248
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.