Вопрос или проблема
Итак, у меня есть пользовательская таксономия (называемая “версия”) только для постов, которая работает нормально.. Моя проблема в том, что я хочу использовать эту таксономию в своих постоянных ссылках, например URL.com/12-3/cat/имянпоста
.. это тоже работает нормально для постов, когда я использую /%version%/%category%/%postname%/
для постоянных ссылок.
НО теперь каждая страница выдает мне ошибку 404.. (например, URL.com/test -> 404). Если я удаляю /%version%
, это работает нормально.. но только для страниц.. но мне нужна таксономия версии в URL для постов.. Код ниже используется для слагов таксономии в постоянных ссылках:
add_filter('post_link', 'version_permalink', 10, 3);
function version_permalink($permalink, $post_id, $leavename) {
if (strpos($permalink, '%version%') === FALSE) {
return $permalink;
} else {
// Получаем пост
$post = get_post($post_id);
if (!$post || 'page' === $post->post_type) return $permalink;
// Получаем термины таксономии
$terms = wp_get_object_terms($post->ID, 'version');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) {
$taxonomy_slug = $terms[0]->slug;
} else { $taxonomy_slug = 'no-version'; }
return str_replace('%version%', $taxonomy_slug, $permalink);
}
}
Я думаю, я сделал какую-то глупую ошибку, о которой не догадываюсь.. Когда я посмотрел на var_dump($wp); он показывает мне, например (для URL.com/impressum):
["query_vars"]=>
array(1) {
["version"]=>
string(9) "impressum"
}
["query_string"]=>
string(17) "version=impressum"
["request"]=>
string(9) "impressum"
["matched_rule"]=>
string(10) "([^/]+)/?$"
["matched_query"]=>
string(17) "version=impressum"
["did_permalink"]=>
bool(true)
так что этот “version” зарегистрирован только для постов, а не для страниц, но всё равно ищет его… У меня нет понятия, как это решить, любая помощь или дополнительные идеи будут очень признательны 🙂
для информации: пользовательская таксономия:
add_action('init', 'version_init');
function version_init() {
if (!is_taxonomy('version')) {
$labels = array(
'name' => __( 'Версии'),
'singular_name' => __( 'Версия'),
'search_items' => __( 'Поиск версий' ),
'popular_items' => __( 'Популярные версии' ),
'all_items' => __( 'Все версии' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Редактировать версию' ),
'update_item' => __( 'Обновить версию' ),
'add_new_item' => __( 'Добавить новую версию' ),
'new_item_name' => __( 'Новое имя версии' ),
'add_or_remove_items' => __( 'Добавить или удалить версию' ),
'choose_from_most_used' => __( 'Выбрать из самых популярных версий' ),
'not_found' => __( 'Версии не найдены.' ),
'menu_name' => __( 'Версии' ),
);
$rewrite = array(
'slug' => '',
'with_front' => false,
'hierarchical' => false,
);
register_taxonomy( 'version', 'post',
array(
'hierarchical' => TRUE,
'labels' => $labels,
'public' => TRUE,
'show_ui' => TRUE,
'show_admin_column' => TRUE,
'update_count_callback' => '_update_post_term_count',
'query_var' => 'version',
'rewrite' => $rewrite
)
);
}
}
Хорошо, теперь у меня это работает.. Думаю, это не совсем аккуратно, но для меня это сработало..
Сначала я исправил отсутствующий slug
в $rewrite
для register_taxonomy
, но это не была настоящая проблема..
- Поскольку мне нужно значение динамически в первую очередь, я создал пустую родительскую страницу для страниц, которые я хотел показать, и поместил их туда. Я назвал её
content
. (Ну, я мог просто вручную изменить постоянную ссылку, но.. я не сделал этого) - Теперь добавил новое правило перезаписи, чтобы страницы использовали правильную строку запроса.
.
function funny_unicorn_rewrite_rules() {
add_rewrite_rule(
'^content/([^/]*)/?$', // используйте "content" как префикс для идентификации моих страниц
'index.php?pagename=content%2F$matches[1]', // исправьте строку запроса
'top'
);
}
add_action('init','funny_unicorn_rewrite_rules');
Чтобы это заработало, мне нужно было вернуть родительскую страницу в строку с content%2F
прямо перед $matches[1]
.
И, конечно, я очистил правила перезаписи после внесения изменений..
Так что остается только тот факт, что это не будет работать с WPML.. когда у меня будет решение и для этого, я обновлю этот пост!
С уважением
Ответ или решение
Решение проблемы 404 ошибок для страниц при использовании кастомной таксономии в WordPress
Создание кастомной таксономии в WordPress и её интеграция в структуру постоянных ссылок — задача, которая может вызвать некоторые сложности, особенно если вы также работаете со страницами. Рассмотрим вашу проблему в деталях и предложим потенциальные решения.
Суть проблемы
Вы создали кастомную таксономию (версии) для постов и настроили структуру постоянных ссылок с использованием %version%
. При этом возникла проблема: страницы на вашем сайте начали выдавать 404 ошибки. Удаление %version%
решает эту проблему, но это не устраивает вас, так как вы хотите сохранить эту часть в адресах ваших постов.
Анализ кода
Ваш код, отвечающий за пермалинки, проверяет, является ли тип поста «page», чтобы избегать применения кастомной таксономии к страницам. Однако все равно страницы попадают в запросы, что приводит к ошибке 404.
if (!$post || 'page' === $post->post_type) return $permalink;
Этот участок кода справедливо исключает страницы, но не решает основную проблему — страницы остаются в процессе обработки URL.
Рекомендации по устранению и оптимизации
-
Правильная регистрация слага для таксономии:
Убедитесь, что слаг вашей таксономии корректно зарегистрирован. Вам необходимо указать его в параметрах при регистрации таксономии:$rewrite = array( 'slug' => 'version', // Укажите правильный slug 'with_front' => false, 'hierarchical' => false, );
-
Добавление правил переписывания:
Для того чтобы страницы не конфликтовали с вашими кастомными URL для постов, вы можете добавить дополнительные правила переписывания. Как вы сделали это с родительской страницейcontent
, вы можете создать уникальное правило:function custom_rewrite_rules() { add_rewrite_rule( '^content/([^/]*)/?$', 'index.php?pagename=content&version=$matches[1]', 'top' ); } add_action('init', 'custom_rewrite_rules');
Это поможет WordPress правильно обрабатывать запросы к страницам, которые начинаются с
content
, и вести к верному содержимому. -
Очистка правил переписывания:
После внесения изменений в правила переписывания необходимо очистить кэш, чтобы новые правила вступили в силу. Это можно сделать через панель администратора или программно:flush_rewrite_rules();
-
Учет WPML:
Если вы планируете использовать WPML для многоязычного контента, следует удостовериться, что ваши кастомные структуры URL совместимы с WPML. В этом случае, возможно, понадобится доработка его интеграции с кастомными таксономиями и правилами переписывания.
Вывод
Тщательная настройка кастомной таксономии и регламентирование структуры постоянных ссылок в WordPress — это процесс, требующий аккуратности. Однако, принимя описанные меры, вы сможете избежать 404 ошибок для страниц и сохранить необходимый функционал для постов. Надеюсь, данные рекомендации помогут вам оптимизировать ваш сайт и улучшить пользовательский опыт. Если у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь обращаться за помощью.