Вопрос или проблема
Итак, я делаю плагин для некоторого нишевого приложения для моего клиента, который включает в себя таблицу с данными, и я создал страницу в плагине, чтобы показать более подробную информацию о строке таблицы.
Вот как я делаю перезапись:
function mytableplugin_page_rewrite(){
$page_slug = 'mytablepluginpage';
// URL будет в формате
// /ваша-страница/42/
add_rewrite_rule(
'mytableplugin/([0-9a-zA-Z_-]+)/?$',
'index.php?pagename=" . $page_slug . "&tid=$matches[1]',
'top'
);
}
Но перенаправление не влияет на канонический URL, поэтому каждая страница "mytableplugin"
имеет один и тот же канонический URL "mytablepluginpage"
.
Я не использую плагин Yoast SEO и не хочу, чтобы мой плагин зависел от него, так что как я могу изменить каноническую ссылку страницы? Я хочу, чтобы сохранено было нестандартное имя (mytableplugin != mytablepluginpage)
и аргумент остался на каноническом URL.
Это вызывает проблему, потому что плагин TranslatePress использует неправильный URL при переключении языков, он возвращает меня на страницу "mytablepluginpage"
, которая не содержит контента без запросов.
Правка: Я попробовал ещё несколько вещей, и захват функции rel_canonical действительно работает для изменения канонического URL, но не решает проблему неправильного URL у плагина translatepress для переключения языков, вот код, который я использовал:
remove_action('wp_head', 'rel_canonical');
add_action('wp_head', 'my_rel_canonical');
function my_rel_canonical() {
if (is_page('mytablepluginpage')) {
global $wp;
echo "<link rel="canonical" href="https://wordpress.stackexchange.com/questions/375343/".home_url( $wp->request ).""/>\n";
} else {
rel_canonical();
}
}
(Этот последний код был взят из этого вопроса на StackOverflow)
Спасибо заранее!
Ладно, я нашёл способ сделать это, если кто-то когда-либо понадобится создать постоянную ссылку или изменить постоянную ссылку для виртуальной страницы или динамической страницы, вот как:
Функции get_permalink()
, the_permalink()
и get_the_permalink()
могут быть отфильтрованы с использованием фильтров post_type_link
, page_link
и/или post_link
, каждый из этих фильтров предназначен для одного типа поста.
Вот функция, которую я использовал:
function mytableplugin_rename_permalink($url, $post) {
$table = get_page_by_path('mytablepluginpage');
global $wp;
if ( 'integer' === gettype( $post ) ) {
$post_id = $post;
} else {
$post_id = $post->ID;
}
// проверяем, целимся ли мы на страницу плагина
if ( $table->ID == $post_id ) {
$url = home_url( $wp->request );
}
apply_filters( 'mytableplugin', home_url( $wp->request ), get_the_ID(), false );
// Возвращаем значение URL
return $url;
}
add_filter( 'post_type_link', 'mytableplugin_rename_permalink', 10, 2 );
add_filter( 'page_link', 'mytableplugin_rename_permalink', 10, 2 );
add_filter( 'post_link', 'mytableplugin_rename_permalink', 10, 2 );
Мне не нужно было добавлять все три фильтра, но я сделал это, чтобы избежать проблем, если я когда-нибудь изменю тип поста страницы в плагине.
Я получил код для того, чтобы он работал с этой страницы и этого вопроса.
Это исправило канонический URL, постоянную ссылку и проблемы с translatePress.
Ответ или решение
Чтобы изменить канонический URL после изменения URL с помощью функции add_rewrite_rule()
в вашем плагине WordPress, необходимо учитывать несколько аспектов, которые связаны с корректным отображением ссылок и устранением проблем с переводами контента. Ниже я приведу полное решение с объяснениями.
Установка правила перезаписи
Сначала вы установили правила перезаписи с помощью следующей функции:
function mytableplugin_page_rewrite() {
$page_slug = 'mytablepluginpage';
// URL будет в формате /mytableplugin/42/
add_rewrite_rule(
'mytableplugin/([0-9a-zA-Z_-]+)/?$',
'index.php?pagename=' . $page_slug . '&tid=$matches[1]',
'top'
);
}
Это позволяет вам обрабатывать URL вида /mytableplugin/42/
и направляет их на страницу с именем mytablepluginpage
, используя параметр tid
.
Изменение канонического URL
Проблема, с которой вы столкнулись, заключается в том, что канонический URL остаётся неизменным, и все страницы с разным содержанием имеют один и тот же канонический URL. В результате при использовании плагина TranslatePress происходит сбой, так как он перенаправляет на страницу без контента.
Для решения этой проблемы вы правильно решили переопределить функцию для генерации канонического URL. Вот как это можно сделать более эффективно:
remove_action('wp_head', 'rel_canonical');
add_action('wp_head', 'my_rel_canonical');
function my_rel_canonical() {
global $wp;
// Проверяем, находимся ли мы на нужной странице
if (is_page('mytablepluginpage')) {
$canonical_url = home_url($wp->request);
echo '<link rel="canonical" href="' . esc_url($canonical_url) . '" />' . "\n";
} else {
rel_canonical(); // Используем стандартный канонический URL для остальных страниц
}
}
Фильтрация ссылок на страницы
Теперь, чтобы обеспечить правильную работу ссылок на страницы, можно использовать фильтры для get_permalink()
, the_permalink()
и get_the_permalink()
:
function mytableplugin_rename_permalink($url, $post) {
$page = get_page_by_path('mytablepluginpage');
global $wp;
$post_id = is_integer($post) ? $post : $post->ID;
// Проверяем, соответствует ли ID страницы и изменяем URL
if ($page->ID === $post_id) {
$url = home_url($wp->request);
}
return $url;
}
add_filter('post_type_link', 'mytableplugin_rename_permalink', 10, 2);
add_filter('page_link', 'mytableplugin_rename_permalink', 10, 2);
add_filter('post_link', 'mytableplugin_rename_permalink', 10, 2);
Заключение
С помощью этих изменений вы не только измените канонический URL, привязанный к динамическим параметрам вашего плагина, но и устраните проблему со сбоем в TranslatePress, обеспечив правильные ссылки для переходов между языками.
Это решение является независимым и не требует дополнительных плагинов, таких как Yoast SEO, что делает ваш плагин более легковесным и специализированным для нужд вашего клиента.
Если у вас возникнут какие-либо другие вопросы или вам понадобятся дополнительные пояснения, не стесняйтесь обращаться за помощью.