Добавление расширения .html к пользовательским типам записей в WordPress

19 июл. 2012 г., 16:47:21
Просмотры: 16.2K
Голосов: 12

Есть ли способ добавить расширение .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 пользовательских типов записей?

5
Комментарии

Просто интересно, по какой причине вы хотите добавить .html?

Vince P Vince P
19 июл. 2012 г. 18:29:47

Ну, function post-type_permalink вызовет ошибку. Если вы не получаете эту ошибку, значит у вас что-то серьезно не так с настройками отладки. Также, пожалуйста, переформулируйте ваш вопрос с правильными отступами в строках. Спасибо.

kaiser kaiser
25 июл. 2012 г. 18:11:00

@kaiser, Просто хочу узнать, как я могу использовать те же настройки постоянных ссылок для пользовательских типов записей. Если я установлю /$postname.html для записей, как я могу использовать то же самое для пользовательских типов записей.

user983248 user983248
25 июл. 2012 г. 18:21:46

Ты не прочитал ни строчки из моего комментария, верно? Пожалуйста, исправь свой код. Также - не работает в названиях функций...

kaiser kaiser
25 июл. 2012 г. 18:23:01

@kaiser Да, я прочитал, но я не Флэш, и у меня проблемы с руками, поэтому я не могу печатать так быстро, как думаю или говорю

user983248 user983248
25 июл. 2012 г. 18:29:58
Все ответы на вопрос 3
2

Это, кажется, работает:

Создайте правила перезаписи 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 (Консоль → Настройки → Постоянные ссылки).

28 июл. 2012 г. 07:41:09
Комментарии

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

brasofilo brasofilo
28 июл. 2012 г. 16:13:13

Этот код перезапишет любые другие фильтры, использующие хук post_type_link

Tom J Nowell Tom J Nowell
1 апр. 2017 г. 18:34:49
0

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

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

После активации плагина просто перейдите в Консоль -> Настройки -> Постоянные ссылки. Там вы сможете добавить специальные правила перезаписи для каждого зарегистрированного пользовательского типа записей.

19 июл. 2012 г. 17:03:44
Комментарии

Не сбрасывайте правила перезаписи при каждой загрузке страницы.

fuxia fuxia
19 июл. 2012 г. 17:07:50

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

user983248 user983248
19 июл. 2012 г. 17:11:58

@toscho как вы предлагаете это сделать или остановить?

user983248 user983248
19 июл. 2012 г. 17:15:28

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

fuxia fuxia
19 июл. 2012 г. 17:19:39

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

user983248 user983248
19 июл. 2012 г. 17:20:03

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

Michael Ecklund Michael Ecklund
19 июл. 2012 г. 18:16:44

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

user983248 user983248
19 июл. 2012 г. 18:34:52
Показать остальные 2 комментариев