Вопрос или проблема
Я пытаюсь переписать структуру постоянных ссылок со своим собственным пользовательским 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-адресам.