Добавление правила перезаписи для пользовательской страницы автора
Пытался создать авторскую страницу с уникальным URL, и все работало хорошо, но при создании URL не учитывались два важных фактора:
- Конфликт имен авторов (одинаковые имена).
- Добавление пагинации на страницу автора (для его опубликованных записей).
Вот мое первоначальное правило:
function add_my_rule() {
global $wp;
$wp->add_query_var('args');
add_rewrite_rule('writer\/(.*)','index.php?pagename=writer&args=$matches[1]','top');
/* глобальная переменная $wp_rewrite;
$wp_rewrite->flush_rules(); */
}
add_action('init', 'add_my_rule');
Это работало для URL вида:
www.myblog.com/writer/umesh-awasthi ,
Но если есть несколько авторов с одинаковым именем, это создаст проблему. Поэтому я планировал сделать URL авторов блога как на Stack Overflow:
www.myblog.com/writer/001/umesh-awasthi
где 001
- это ID пользователя, который всегда уникален.
Вторая проблема с пагинацией: я могу создать пагинацию на странице автора, но при переходе на вторую страницу URL выглядит так:
http://localhost/blog/wordpress/writer/umesh-awasthi/page/2/
и согласно моему правилу перезаписи я получу параметр umesh-awasthi/page/2
, что означает, что мой запрос не будет работать, так как он ожидает имя автора как umesh-awasthi
, а получает umesh-awasthi/page/2
.
Вопрос: могу ли я переписать правило, чтобы получать данные в трех разных переменных:
- ID пользователя
- Имя автора
- Номер страницы (если есть)
Будучи новичком в WordPress и перезаписи URL, я не уверен, как этого добиться. Заранее спасибо за помощь.

function add_my_rule() {
global $wp;
$wp->add_query_var('args');
$wp->add_query_var('arg_username');
add_rewrite_rule('writer/([0-9]+)/([^/]*)/page/([0-9]+)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]&paged=$matches[3]','top');
add_rewrite_rule('writer/([0-9]+)/([^/]*)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]','top');
/*global $wp_rewrite;
$wp_rewrite->flush_rules();*/
}
add_action('init', 'add_my_rule');
Это должно сработать. Первое правило перезаписи для writer/user_id/username (имя пользователя не используется в правиле перезаписи, но необходимо для его работы). Второе правило аналогичное, но добавляет пагинацию.
РЕДАКТИРОВАНО: добавил arg_username в код выше.

это не работает, как ожидалось, используя приведенное выше правило, я получаю только user-id
, а не имя автора. Это означает, что для www.myblog.com/writer/001/umesh-awasthi
приведенное выше правило дает мне только 001
, а не имя автора.

Это работает так, как я сказал в своем ответе. Если у вас есть ID пользователя, вам не нужно имя пользователя. Если вам нужно и то, и другое, вы можете добавить еще один queryvar (например, arg_username) и добавить его в rewriterule: add_rewrite_rule('writer/([0-9]+)/([^/]*)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]','top');
(также измените это в другом rewriterule).

возможно, я делаю что-то не так из-за недостатка знаний, но add_rewrite_rule('writer/([0-9]+)/([^/]*)','index.php?pagename=writer&args=$matches[1]','top');
add_rewrite_rule('writer/([0-9]+)/([^/]*)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]','top');
add_rewrite_rule('writer/([0-9]+)/([^/]*)/page/([0-9]+)','index.php?pagename=writer&args=$matches[1]&arg_username=$matches[2]&paged=$matches[3]','top');
правило все еще не дает мне имя автора.

К сожалению, значение $paged
всегда возвращается как 0
. Я даже изменил значение на $page_num
и добавил это в мою функцию $wp->add_query_var('paged_num');
, но ничего не сработало.
