Доброго времени суток. Возникла проблема следующего характера. Личный кабинет выводится на странице автора (domain.ru/author/user). Изменил slug "author" на "user", но recall его не воспринимает, то есть ссылки везде так и выводятся "domain.ru/author/user" вместо нового "domain.ru/user/user", а при прямом ручном переходе ЛК не работает (пример на скриншоте). Как исправить? Заранее признателен.
Otshelnik-Fm сказал(а)
pro100maxik сказал(а)
Изменил slug "author" на "user"как изменили?
author - это стандартный ВП механизм. Его так вордпресс выводит. К плагину тут врядли отношение есть
С помощью функции:
add_action('init', 'cng_author_base');
function cng_author_base() {
global $wp_rewrite;
$author_slug = 'user'; // slug name
$wp_rewrite->author_base = $author_slug;
}
Также с помощью плагина "Edit Author Slug" пробовал. Эффект одинаковый.
Otshelnik-Fm сказал(а)
неверное решение. Этот метод не везде внутри вордпресса исправляет. Я гуглил как-то давно этот вопрос - предложенные, более функциональные методы, тоже имели проблемы и отказался от затеи.
Вот рабочая функция. Убирает полностью "author". Проблема только в том, что recall делает ЛК не активным.По идее должен быть выход.
// Первая часть // add_filter('author_rewrite_rules', 'no_author_base_rewrite_rules'); function no_author_base_rewrite_rules($author_rewrite) { global $wpdb; $author_rewrite = array(); $authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users"); foreach($authors as $author) { $author_rewrite["({$author->nicename})/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&paged=$matches[2]'; $author_rewrite["({$author->nicename})/?$"] = 'index.php?author_name=$matches[1]'; } return $author_rewrite; } // Вторая часть // add_filter('author_link', 'no_author_base', 1000, 2); function no_author_base($link, $author_id) { $link_base = trailingslashit(get_option('home')); $link = preg_replace("|^{$link_base}author/|", '', $link); return $link_base . $link; }
Андрей CS сказал(а)
урл формируется стандартной функцией get_author_posts_url(), надо смотреть, что внутри нее не дает это сделать, это уже ядро ВП
- да вот в том то и дело что ВП не дает так вот разом все сменить. Говорил же выше - проблем выскакивало в самых неожиданных местах я и бросил эту затею.
Андрей CS сказал(а)
в смысле формируется некорректный путь в ссылке до личного кабинета? урл формируется стандартной функцией get_author_posts_url(), надо смотреть, что внутри нее не дает это сделать, это уже ядро ВП
Да. Ладно. В любом случае спасибо, вечером попробую поковырятся и если получится напишу готовое решение. Надеюсь
Решил данный вопрос, если кому станет интересно, вот таким образом.
Первый вариант полностью убрать "author" оставив только имя пользователя "domain.com/user" добавив ниже приведенную функцию в functions.php своей темы:
// убираем слово "author" из url'a на профиль пользователя add_filter('author_rewrite_rules', 'no_author_base_rewrite_rules'); function no_author_base_rewrite_rules($author_rewrite) { global $wpdb; $author_rewrite = array(); $authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users"); foreach($authors as $author) { $author_rewrite["({$author->nicename})/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&paged=$matches[2]'; $author_rewrite["({$author->nicename})/?$"] = 'index.php?author_name=$matches[1]'; } return $author_rewrite; } add_filter('author_link', 'no_author_base', 1000, 2); function no_author_base($link, $author_id) { $link_base = trailingslashit(get_option('home')); $link = preg_replace("|^{$link_base}author/|", '', $link); return $link_base . $link; } // конец
Далее заходим в /wp-content/plugins/wp-recall/wp-recall.php и на 278 строке меняем:
if($u!='author') continue;
на:
if($u!='') continue;
На этом первый вариант окончен.
Второй вариант заменить slug "author" на свой в произвольной форме:
1. Заходим в официальный репозиторий WP и устанавливаем плагин
. В настройках плагина выставляем свое произвольное значение вместо "author".
2. Далее нам нужно изменить все существующие пути автора в WP на новые, заданные нами. Для этого заходим в functions.php своей темы и добавляем следующую функцию, предварительно заменив значение profile на свое, которое выставили в Edit Author Slug:
add_filter('author_link', 'no_author_base', 1000, 2); function no_author_base($link, $author_id) { $link_base = trailingslashit(get_option('home')); $link = preg_replace("|^{$link_base}author/|", 'profile/', $link); //меняем "profile" на свое значение выставленное в плагине Edit Author Slug return $link_base . $link; }
3. И на последок заходим в /wp-content/plugins/wp-recall/wp-recall.php и на 278 строке меняем:
if($u!='author') continue;
на:
if($u!='ваше значение') continue;
в котором нужно будет заменить строчку "ваше значение" на свой вариант, выставленный в Edit Author Slug.
На этом настройка закончена. Спасибо Андрей CS за помощь.
P.S. Если не хотите грузить свой сайт лишними плагинами, можете вместо плагина добавить следующую функцию в functions.php своей темы, предварительно заменив profile на свое значение:
add_action('init', 'cng_author_base'); function cng_author_base() { global $wp_rewrite; $author_slug = 'profile'; //значене slug'а $wp_rewrite->author_base = $author_slug; }
pro100maxik, спасибо очень полезно и актуально!
Вопрос к разработчикам wp-recall - а как сделать так, чтобы каждое следующее обновление не затирало изменения предложенные выше. Нельзя сделать, чтобы плагин брал тот слаг, который по умолчанию (или изменен) на wordpress сайте?
Хм, проверил только что - простой код смены слага вставленный в function.php прекрасно меняет слаг author. Без всяких плагинов и правок в самом wp-recall.
Вот код, который я вставил:
add_action('init','change_author_permalinks');
function change_author_permalinks()
{
global $wp_rewrite;
$wp_rewrite->author_base = 'member'; // Change 'member' to be the base URL you wish to use
$wp_rewrite->author_structure = '/' . $wp_rewrite->author_base. '/%author%';
}
Так и должно быть? 🙂
В 2020 году изменился малясь способ изменения...
А все потому-что определение страницы автора и подключение шаблона было так:
if($u!='author') continue;
А стало так:
if ( $u != $wp_rewrite->author_base ){ continue; }
И почему-то простая привязка к action-у init и в нем изменение $wp_rewrite->author_base срабатывало позже, чем срабатывал этот код, и поэтому я начал пересматривать все action-ы которые идут до init и по порядку начал их проверять. Сработал этот код:
add_action( 'after_setup_theme', function(){ global $wp_rewrite; $wp_rewrite->author_base = 'account'; }, 1);
И потом остается просто переделать ссылки( кстати то, что предложено выше работает корявенько. Ссылка начинает дублироваться типа:
://сайт/author/name ), и в общем у меня получился такой рабочий код:
add_action( 'after_setup_theme', function(){ global $wp_rewrite; $wp_rewrite->author_base = 'account'; }, 1);
// Первая часть // add_filter('author_rewrite_rules', 'no_author_base_rewrite_rules'); function no_author_base_rewrite_rules($author_rewrite) { global $wpdb; $author_rewrite = array(); $authors = $wpdb->get_results("SELECT user_nicename AS nicename from $wpdb->users"); foreach($authors as $author) { $author_rewrite["({$author->nicename})/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&paged=$matches[2]'; $author_rewrite["({$author->nicename})/?$"] = 'index.php?author_name=$matches[1]'; } return $author_rewrite; }
// Вторая часть // add_filter('author_link', 'no_author_base', 1000, 2); function no_author_base($link, $author_id) { $link_base = trailingslashit(get_option('home')); $link = preg_replace("|^{$link_base}author/|", 'account/', $link); return $link; }
+ тут ещё проблема в том, что если у вас не будет стоят в постоянных ссылках "/%postname%/", то изменение ссылок не будет срабатывать и вас закинет на "http://сайт/?author=...", так что тут ещё нужно додумывать
+ Ещё есть проблема с выводом названия страницы, который прописывается в теге head в теге title. У меня высвечивалась( Неизвестная страница ) и нужно добавить в код сайта вот такой код:
add_filter( 'pre_get_document_title', 'my_pre_get_document_title' ); function my_pre_get_document_title( $title ) { global $user_LK; if ( (boolean) $user_LK ) { $title = 'Профиль пользователя - ' . get_the_author_meta( 'display_name', $user_LK ); } return $title; }
Надеюсь кому-то помогу!