Добавьте %post_id% к слагу пользовательского типа записи и предотвратите проблему “уникального слага”, которую делает WP?

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

У меня есть пользовательский тип записи под названием “оборудование”. Я хотел бы, чтобы структура постоянной ссылки была следующей:

example.com/equipment/%post_id%-slug

Я специально хочу использовать дефис, а не косую черту (т.е. – “id-slug”, а не “id/slug”). Каждое возможное решение, которое я нашел в интернете, использовало косые черты, и я просто не могу заставить это работать с дефисом.

Я также хочу предотвратить добавление WordPress дополнительного номера, если есть две записи с одинаковым заголовком. Пример:

example.com/equipment/45-awesomeness
и
example.com/equipment/46-awesomeness-2

Я думаю, что решение состоит в использовании add_rewrite_rule, но я немного запутался с регулярными выражениями.

Следующий код работал, чтобы заменить имя записи на id в слаг:

function equipment_links($post_link, $post = 0) {
    if($post->post_type === 'equipment') {
        return home_url('equipment/' . $post->ID . '');
    }
    else{
        return $post_link;
    }
}
add_filter('post_type_link', 'equipment_links', 1, 3);


function equipment_rewrites_init(){
    add_rewrite_rule('equipment/([0-9]+)?$', 'index.php?post_type=equipment&p=$matches[1]', 'top');
}
add_action('init', 'equipment_rewrites_init');

Это вернуло URL “example.com/equipment/123”, но я хотел бы добавить “-post_name” в конец этого “123”.

У меня не так много опыта с переписыванием кода, но разве нельзя просто добавить $post->post_name в ваше выражение возврата?

return home_url('equipment/' . $post->ID . '-' . $post->post_name );

Есть и другие способы изменить постоянные ссылки, которые я использовал и которые могут вам помочь:

  1. Самый простой способ изменить структуру постоянной ссылки, вероятно, состоит в использовании пользовательской структуры, перейдя в меню администратора, настройки > постоянные ссылки. Выберите пользовательскую структуру и установите ее на /%post_id%-%postname%/
  2. Если вы хотите изменить структуру постоянной ссылки для конкретного типа записи, не трогая никакой код или другой тип записи, я бы посоветовал скачать плагин, такой как “Постоянные ссылки для пользовательских типов записей” или “Простые постоянные ссылки для типов записей”, оба от Toro_Unit.

Что касается уникального идентификатора, который вы хотите убрать в конце… У меня нет на это ответа. Однако, если вы готовы использовать переписывание .htaccess вместо php, вы можете попробовать вот это:

https://stackoverflow.com/questions/14635438/remove-trailing-number-from-url-via-htaccess

Чтобы получить результат для структуры постоянной ссылки для вашего пользовательского типа записи “оборудование” и предотвратить добавление WordPress номера к слагу, если есть записи с одинаковым заголовком, вы можете использовать фильтр post_type_link и настроить процесс генерации постоянной ссылки.

Добавьте код в файл вашей темы functions.php или в пользовательский плагин

// Измените структуру постоянной ссылки для пользовательского типа записи "оборудование"
function custom_equipment_permalink($permalink, $post) {
    // Убедитесь, что это наш пользовательский тип записи
    if ('equipment' === $post->post_type) {
        // Получите ID записи
        $post_id = $post->ID;

        // Получите имя записи (слаг)
        $post_slug = $post->post_name;

        // Составьте постоянную ссылку с желаемым форматом
        $new_permalink = home_url("/equipment/{$post_id}-{$post_slug}");

        return $new_permalink;
    }

    return $permalink;
}
add_filter('post_type_link', 'custom_equipment_permalink', 10, 2);



// Предотвратите добавление WordPress номера к слагу, если есть записи с одинаковым заголовком
function prevent_duplicate_post_slugs($slug, $post_ID, $post_status, $post_type) {
    // Убедитесь, что это наш пользовательский тип записи
    if ('equipment' === $post_type) {
        global $wpdb;

        // Получите количество записей с одинаковым слагом
        $check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1";
        $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $slug, $post_type, $post_ID));

        // Если есть записи с одинаковым слагом, добавьте номер, чтобы сделать его уникальным
        if ($post_name_check || -1 !== intval(get_page_by_path($slug, OBJECT, $post_type))) {
            $suffix = 2;
            do {
                $alt_post_name = $slug . '-' . $suffix;
                $post_name_check = $wpdb->get_var($wpdb->prepare($check_sql, $alt_post_name, $post_type, $post_ID));
                $suffix++;
            } while ($post_name_check);

            return $alt_post_name;
        }
    }

    return $slug;
}
add_filter('wp_unique_post_slug', 'prevent_duplicate_post_slugs', 10, 4);

Ответ или решение

Как добавить %post_id% к слагу пользовательского типа записи и предотвратить уникальность слага в WordPress

Если вы работаете с пользовательским типом записи в WordPress, таким как "оборудование", и хотите изменить структуру URL так, чтобы она выглядела как:

example.com/equipment/%post_id%-slug

где %post_id% — это ID поста, а slug — это его название, вам необходимо провести несколько настроек. В этой инструкции мы обсудим, как добиться желаемого результата и избежать добавления уникальных индикаторов к слагу в случае совпадения названий записям.

Прежде всего, вам необходимо отредактировать формат permalink для вашего пользовательского типа записи. Добавьте следующий код в файл functions.php вашей темы или в плагин:

// Изменяем структуру permalink для пользовательского типа записи "оборудование"
function custom_equipment_permalink($permalink, $post) {
    if ('equipment' === $post->post_type) {
        $post_id = $post->ID;
        $post_slug = $post->post_name;
        $new_permalink = home_url("/equipment/{$post_id}-{$post_slug}");
        return $new_permalink;
    }
    return $permalink;
}
add_filter('post_type_link', 'custom_equipment_permalink', 10, 2);

Этот код проверяет, является ли тип записи "оборудование", и формирует новый permalink в нужном вам формате, комбинируя ID поста и его название.

Шаг 2: Настройка переработки правил

Следующий шаг — это добавление правила переработки, чтобы WordPress мог распознать ваш новый формат URL. Этот код также нужно добавить в functions.php:

function equipment_rewrites_init() {
    add_rewrite_rule('^equipment/([0-9]+)-([a-zA-Z0-9-]+)/?$', 'index.php?post_type=equipment&name=$matches[2]&p=$matches[1]', 'top');
}
add_action('init', 'equipment_rewrites_init');

Здесь мы используем add_rewrite_rule, чтобы сообщить WordPress, как обрабатывать новые URL. Это правило обозначает, что любой URL вида example.com/equipment/123-awesomeness должен быть связан с постом с ID 123 и слагом "awesomeness".

Шаг 3: Избежание дублирующихся слагов

Чтобы избежать добавления к постам уникальных индикаторов (например, -2, -3), если есть несколько постов с одинаковым названием, вам нужно использовать следующий код:

function prevent_duplicate_post_slugs($slug, $post_ID, $post_status, $post_type) {
    if ('equipment' === $post_type) {
        global $wpdb;

        // Проверяем наличие дублирующего слага
        $post_name_check = $wpdb->get_var($wpdb->prepare("SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1", $slug, $post_type, $post_ID));

        if ($post_name_check) {
            return $slug; // Возвращаем исходный слаг, чтобы избежать добавления уникального индикатора
        }
    }
    return $slug;
}
add_filter('wp_unique_post_slug', 'prevent_duplicate_post_slugs', 10, 4);

Заключение

С применением вышеуказанных настроек вы сможете добиться желаемого формата URL example.com/equipment/%post_id%-slug, а также предотвратить добавление уникальных индикаторов для слагов. После внесения изменений не забудьте обновить настройки перезаписи в WordPress, сделав это в разделе "Настройки" -> "Постоянные ссылки". Это важный шаг для корректного функционирования новых правил.

Эти изменения обеспечат удобство для пользователей и улучшат визуальное восприятие вашего сайта, позволяя более точно определять содержимое по URL.

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

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