Вопрос или проблема
Я использую этот код для “конвертации” пользовательского типа записи в /customtype/postname.html
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' ); // для cpt post_type_link (вместо post_link)
function custom_post_permalink ( $post_link ) {
global $post;
$type = get_post_type( $post->ID );
return home_url( $type . "https://wordpress.stackexchange.com/" . $post->post_name . '.html' );
}
Это работает очень хорошо.
Но!
Если вы создадите ЧЕРНОВИК записи и затем наведете курсор на ПРЕДПРОСМОТР (в wp – admin)
Вы увидите URL вида: http://www.domain.com/customtype/.html?preview=true
Как я могу это исправить? Эта проблема только с ссылкой “ПРЕДПРОСМОТР“.
Вот простое решение: если у записи статус ЧЕРНОВИК, мы показываем “нормальный” не измененный “URL”.
add_filter( 'post_type_link', 'custom_post_permalink' ); // для cpt post_type_link (вместо post_link)
function custom_post_permalink ( $post_link ) {
global $post;
$type = get_post_type( $post->ID );
$post_status = get_post_status( $post->ID ); //получаем СТАТУС ЗАПИСИ
if($post_status != "draft") {
return home_url('PUT YOUR CUSTOM POST TYPE HERE/'.$post->post_name.'.html');
} else {
//если СТАТУС ЗАПИСИ ЧЕРНОВИК
return home_url('?post_type=PUT YOUR CUSTOM POST TYPE HERE&p='.$post->ID.'&preview=true');
}
}
Ответ или решение
Для решения проблемы с некорректной обработкой URL-адресов в случае предварительного просмотра черновых записей пользовательских типов постов на WordPress, можно воспользоваться кастомной функцией, как показано в предоставленном примере кода. Постараемся более полно объяснить, как функционирует данное решение, а также предложим улучшение для ситуаций с предварительным просмотром.
Проблемное описание
Существует задача преобразования пользовательских типов постов таким образом, чтобы их URL-адреса отображались в формате <strong>/customtype/postname.html</strong>
. В текущей реализации пользователь сталкивается с проблемой, что при попытке предварительного просмотра чернового поста, генерируется некорректный URL, например: http://www.domain.com/customtype/.html?preview=true
.
Решение
Для корректного генерирования URL-адресов, включая обработку черновиков, мы использовали фильтр post_type_link
, добавляя возможность учитывать статус поста. Если пост имеет статус "черновик", следует генерировать стандартный URL с параметрами для просмотра.
Код реализации
Функция, обрабатывающая URL, была модифицирована для проверки статуса поста. Если пост в статусе "черновик", генерируется URL вида ?post_type=...&p=...&preview=true
. В случае других статусов, формируется URL с структурой <post_type>/<post_name>.html
.
add_filter('post_type_link', 'custom_post_permalink'); // для cpt post_type_link (в отличие от post_link)
function custom_post_permalink($post_link) {
global $post;
$type = get_post_type($post->ID);
$post_status = get_post_status($post->ID); // Получаем статус поста
if ($post_status !== "draft") {
// Генерация URL для опубликованных постов
return home_url("{$type}/{$post->post_name}.html");
} else {
// Генерация URL для черновиков
return home_url("?post_type={$type}&p={$post->ID}&preview=true");
}
}
Объяснение и детали реализации
-
Фильтр
post_type_link
: добавляется к функцииadd_filter
, что позволяет модифицировать URL-адреса для всех пользовательских типов постов. -
Проверка состояния поста: используется
get_post_status
, для проверки, черновик это или опубликованный пост. -
Формирование URL:
- Для черновиков используется стандартная структура с параметрами
?p=ID&preview=true
. - Для опубликованных постов — URL в формате
.html
.
- Для черновиков используется стандартная структура с параметрами
Вывод
Данное решение позволяет надежно управлять URL-адресами в WordPress для пользовательских типов постов, делая исключение для черновиков. Это позволяет избежать проблем с некорректными адресами при предварительном просмотре, обеспечивая при этом чистую и читаемую структуру URL для всех других случаев.
Следуя бизнес-стандартам и применяя оптимизированные подходы, вы сможете улучшить структуру URL на вашем сайте, что положительно скажется на SEO и общем пользовательском опыте.