Добавьте расширение .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';
}

Для пользовательских типов сообщений ???

Есть ли какой-либо фрагмент кода, похожий на приведенный выше, который позволяет мне изменить или добавить .htmlURL-адрес пользовательского типа сообщения?

user983248
источник
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.

vmassuchetto
источник
6
Oi Vinicius, хорошая практика ответа - ставить перед всеми именами функций wpse_59024_ (ID вопроса), чтобы избежать конфликтов копирования / вставки;). , , И имеет дополнительное преимущество, зная, к какому ответу относится этот код в нашей библиотеке фрагментов. , , , , +1 Спот на!
brasofilo
Этот код будет перезаписывать любые другие фильтры, которые используют post_type_linkфильтр
Том Дж. Новелл
4

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

Если вы предпочитаете, чтобы плагин WordPress выполнял за вас эту работу, посмотрите Постоянные ссылки на пользовательский тип поста в хранилище плагинов WordPress. Протестировано на WordPress 3.4.1 и работает отлично.

После активации плагина просто перейдите в Dashboard -> Settings -> Permalinks. Вы можете добавить определенные изменения для каждого зарегистрированного пользовательского типа сообщения.

Майкл Эклунд
источник
3
Не сбрасывайте правила перезаписи при каждой загрузке страницы.
fuxia
этот код не работает, даже если вы просто копируете и вставляете код из xplus3.net/2010/05/20/wp3-custom-post-type-permalinks, убедитесь, что он работает как положено -1, если не тестируете
user983248
@ toscho как ты думаешь сделать это или остановить это?
user983248
1
flush_rules()должен вызываться при де / активации только потому, что он очень медленный. Вы можете проверить, $GLOBALS['wp_rewrite']->rulesесли правила уже известны.
fuxia
@ Майкл Эклунд Это дает 404, я не работаю. Вы тестировали этот код?
user983248