Добавление расширения .html к пользовательским типам записей в WordPress
Есть ли способ добавить расширение .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';
}
А как быть с пользовательскими типами записей (Custom Post Types)???
Существует ли аналогичный кусок кода, который позволит мне изменить или добавить .html
к URL пользовательских типов записей?

Это, кажется, работает:
Создайте правила перезаписи URL в формате тип-записи/название-записи.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' ); // для пользовательских типов записей используем post_type_link (вместо 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' );
Как уже упоминалось, после выполнения вышеуказанных действий необходимо сбросить правила перезаписи URL. Это можно сделать, посетив страницу настроек постоянных ссылок в админ-панели: options-permalink.php
(Консоль → Настройки → Постоянные ссылки).

Привет, Vinicius, хорошей практикой является добавление префикса wpse_59024_
(ID вопроса) ко всем именам функций, чтобы избежать конфликтов при копировании/вставке ;) . . . Это также дает дополнительное преимущество — легко понять, к какому ответу относится этот код в нашей библиотеке сниппетов. . . . . +1 Точно подмечено!

Вы можете добавить правило перезаписи, которое заменит встроенные постоянные ссылки, например, для пользовательского типа записей "product"...
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 лент, последующих страниц, трекбэков и т.д. Приведённый выше код работает только для основной страницы пользовательского типа записей.

Если вы предпочитаете использовать плагин WordPress для этой задачи, обратите внимание на Custom Post Type Permalinks в репозитории плагинов WordPress. Плагин протестирован на WordPress 3.4.1 и работает отлично.
После активации плагина просто перейдите в Консоль -> Настройки -> Постоянные ссылки. Там вы сможете добавить специальные правила перезаписи для каждого зарегистрированного пользовательского типа записей.

этот код не работает, также если вы просто копируете и вставляете код с http://xplus3.net/2010/05/20/wp3-custom-post-type-permalinks/ убедитесь, что он работает как ожидалось -1 за отсутствие тестирования

flush_rules()
следует вызывать только при деактивации/активации, так как это очень медленная операция. Вы можете проверить $GLOBALS['wp_rewrite']->rules
, чтобы убедиться, что правила уже известны.

@Michael Ecklund Возвращает 404 ошибку, не работает. Вы тестировали этот код?

@user983248 Любительская ошибка - не протестировал код. Приношу извинения. Однако, думаю, что программное решение этой задачи довольно сложное. Предложенное плагинное решение отлично работает на WordPress 3.4.1

@MichaelEcklund Просто чтобы сохранить внешний вид и поток, страницы и записи уже имеют расширение .html, и лично мне не нравятся URL-адреса, не заканчивающиеся на расширение файла или даже завершающий слэш. Плагин, который ты упомянул, не работает в моем случае, он вообще не делает никакой разницы, посмотри здесь -> http://wordpress.stackexchange.com/questions/59006/custom-post-types-and-permalinks Это пользовательский тип записи, где я пытаюсь добавить расширение .html.
