HTML POST расширение для произвольного типа записи – ЧЕРНОВИК – ПРЕДПРОСМОТР

Вопрос или проблема

Я использую этот код для “конвертации” пользовательского типа записи в /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");
    }
}

Объяснение и детали реализации

  1. Фильтр post_type_link: добавляется к функции add_filter, что позволяет модифицировать URL-адреса для всех пользовательских типов постов.

  2. Проверка состояния поста: используется get_post_status, для проверки, черновик это или опубликованный пост.

  3. Формирование URL:

    • Для черновиков используется стандартная структура с параметрами ?p=ID&preview=true.
    • Для опубликованных постов — URL в формате .html.

Вывод

Данное решение позволяет надежно управлять URL-адресами в WordPress для пользовательских типов постов, делая исключение для черновиков. Это позволяет избежать проблем с некорректными адресами при предварительном просмотре, обеспечивая при этом чистую и читаемую структуру URL для всех других случаев.

Следуя бизнес-стандартам и применяя оптимизированные подходы, вы сможете улучшить структуру URL на вашем сайте, что положительно скажется на SEO и общем пользовательском опыте.

Оцените материал
Добавить комментарий

Капча загружается...