Перезапись URL – вставить пользовательские переменные в виде пути директории.

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

Я пытаюсь переписать структуру постоянных ссылок со своим собственным пользовательским URL в WordPress для темы Divi “проект”

Я уже изменил “слаг Divi” с “project” на “prodotti”, так что в настоящее время URL выглядит так:

http://www.example.com/prodotti/%postname%/

с моей пользовательской функцией

function custom_post_name() {
    return array(
        'feeds' => true,
        'slug' => 'prodotti',
        'with_front' => false,
    );
}
add_filter('et_project_posttype_rewrite_args', 'custom_post_name');

Я хочу добавить к этим URL переменную, которая хранится для каждого поста в post_metadata, чтобы сформировать URL как:

http://www.example.com/prodotti/<mypostoptionvalue>/%postname%/

например:

http://www.example.com/prodotti/AEX1102/%postname%/
http://www.example.com/prodotti/AEX1103/%postname%/
http://www.example.com/prodotti/AEX1104/%postname%/

Есть ли способ достичь такого поведения?

Я провел много тестов, используя {$permastruct}_rewrite_rules, page_rewrite_rules, post_rewrite_rules и многие другие, начиная с: https://codex.wordpress.org/Class_Reference/WP_Rewrite, без результатов.

Я думаю, вы хотите сделать что-то вроде этого:

add_action('init', 'my_rewrite');
function my_rewrite() {
  global $wp_rewrite;
  // Ваша желаемая структура
  $permalink_structure="/prodotti/%my_custom_variable%/%postname%/"
  // добавьте пользовательскую переменную в теги wp_rewrite
  $wp_rewrite->add_rewrite_tag("%my_custom_variable%", '([^/]+)', "my_custom_variable=");
  // Здесь вам нужно знать название пользовательского типа записи, для которого вы хотите использовать структуру постоянных ссылок
  $wp_rewrite->add_permastruct('custom_post_type_name', $permalink_structure, false);
}

Это должно изменить вашу структуру постоянных ссылок для типа записи.
Если вы сейчас посетите пост с именем “foobar” (в админке wp), он должен показать вам постоянную ссылку:

/prodotti/%my_custom_variable%/foobar/

Все, что вам теперь нужно сделать, это перехватить создание постоянной ссылки через хуку “post_type_link” и заменить строку “%my_custom_variable%” на то, что вы хотите, что-то вроде этого:

add_filter('post_type_link', 'intercept_permalink', 10, 3);
function intercept_permalink ($permalink, $post, $leavename) {
  // проверьте, содержит ли текущая постоянная ссылка нашу пользовательскую переменную
  if ( strpos($permalink, '%my_custom_variable%') !== false ) {
    // получите метаданные этого поста с помощью $post->ID
    $my_str = get_post_meta($post->ID, 'meta_key');
    // возможно, проверьте, легитимны ли метаданные поста и, возможно, у вас будет какой-то резервный вариант, если это пусто или что-то еще
    // Затем мы просто заменяем строку пользовательской переменной на нашу новую строку
    $permalink = str_replace('%my_custom_variable%', strtolower($my_str), $permalink);
  }
  return $permalink;
}

Я не тестировал этот конкретный код, но недавно делал нечто подобное в одном из моих проектов

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

Чтобы добиться изменения структуры постоянных ссылок в WordPress для темы Divi с добавлением пользовательских переменных в виде пути директории, необходимо выполнить несколько шагов. Следующее руководство проведет вас через создание необходимого функционала с использованием хуков WordPress.

Шаг 1: Определение структуры постоянных ссылок

Сначала вам нужно установить вашу желаемую структуру постоянных ссылок. В вашем случае это будет:

/prodotti/%my_custom_variable%/%postname%/

Шаг 2: Добавление пользовательского тега в перезапись

Для этого используйте хук init для добавления вашего пользовательского тега и структуры:

add_action('init', 'my_rewrite');
function my_rewrite() {
    global $wp_rewrite;

    // Ваша желаемая структура
    $permalink_structure = "/prodotti/%my_custom_variable%/%postname%/";

    // Добавление пользовательского тега
    $wp_rewrite->add_rewrite_tag("%my_custom_variable%", '([^/]+)', "my_custom_variable=");

    // Добавление структуры постоянных ссылок
    $wp_rewrite->add_permastruct('project', $permalink_structure, false);
}

Шаг 3: Интерцепция ссылки на пост

Чтобы заменить пользовательскую переменную на значение, хранящееся в метаполе поста, используйте хук post_type_link:

add_filter('post_type_link', 'intercept_permalink', 10, 3);
function intercept_permalink($permalink, $post, $leavename) {
    if (strpos($permalink, '%my_custom_variable%') !== false) {
        // Получение значения метаполя
        $my_str = get_post_meta($post->ID, 'meta_key', true); // 'meta_key' — это ключ метаполя

        // Проверка на существование и установка значения по умолчанию
        if (empty($my_str)) {
            $my_str = 'default_value'; // замените на нужное значение по умолчанию
        }

        // Замена пользовательской переменной
        $permalink = str_replace('%my_custom_variable%', strtolower($my_str), $permalink);
    }
    return $permalink;
}

Шаг 4: Обновление правил перезаписи

После добавления нового правила перезаписи убедитесь, что вы обновили свои пермалинки в админке WordPress, перейдя в "Настройки" > "Постоянные ссылки" и сохранив их. Это необходимо для применения новых настроек.

Заключение

Теперь, когда вы добавили эти функциональные части в файл функций вашей темы (обычно functions.php), ссылки на ваши посты с новым значением метаполя будут выглядеть следующим образом:

http://www.example.com/prodotti/AEX1102/foobar/
http://www.example.com/prodotti/AEX1103/foobar/
http://www.example.com/prodotti/AEX1104/foobar/

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

Этот подход позволяет значительно повысить удобство использования вашего сайта и улучшить SEO-оптимизацию благодаря ясным и значимым URL-адресам.

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

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