Как получить красивые URL с помощью add_query_arg в постоянных ссылках
С помощью add_query_arg()
удобно добавлять дополнительные параметры к URL, а также легко создавать правила перезаписи. Вроде бы все хорошо. Но проблема в замене URL, которую выполняет WordPress.
Когда у меня есть URL, например:
www.mysite.com/?page_id=1&myvar=test
и я ввожу этот URL в адресную строку браузера с активированными постоянными ссылками, этот URL преобразуется в:
www.example.com/pagename/?myvar=test
НО: мне хотелось бы получить:
www.example.com/pagename/test
В итоге, я хотел бы использовать код типа:
<a href="<?php add_query_arg( 'myvar', 'test', get_permalink() ) ?>"> .... </a>
который должен давать результат:
www.example.com/pagename/test
Как этого добиться? Я потратил часы на изучение документации, но так и не нашел решения.

Только что столкнулся с такой же ситуацией и наткнулся на этот вопрос во время поиска в Google.
Похоже, что это невозможно. Ядро WordPress просто добавляет строки к URL, если включены "человекопонятные" постоянные ссылки, см. https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/link-template.php#L571
Для тех, кому это интересно: Вы можете сделать что-то подобное в своём коде:
if ( '' != get_option('permalink_structure') ) {
// если используются "человекопонятные" постоянные ссылки, добавляем к URL
$read = user_trailingslashit( get_permalink() . 'test' ); // www.example.com/pagename/test
} else {
$read = add_query_arg( 'test', '', get_permalink() ); // www.example.com/pagename/?test
}
Это решение также было рекомендовано Джоном Кейвом в комментарии на официальном блоге Make WordPress: https://make.wordpress.org/plugins/2012/06/07/rewrite-endpoints-api/#comment-686

Решение для Wordpress - добавить правила перезаписи URL, чтобы сделать что-то вроде этого:
add_action( 'init', 'my_rewrite_add_rewrites' );
function my_rewrite_add_rewrites()
{
add_rewrite_rule( 'calendar/([0-9]{4})/?$', 'index.php?post_type=events&year=$matches[1]', 'top' );
add_rewrite_rule( 'calendar/([0-9]{4})/page/?([0-9]{1,})/?$', 'index.php?post_type=events&year=$matches[1]&paged=$matches[2]', 'top' );
}
читать далее: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule

WordPress не позволит вам сделать это легко. На самом деле, правила перезаписи (rewrite rules) — это ваш единственный вариант для достижения подобного в WordPress, и они могут стать очень запутанными по мере роста вашего сайта, поскольку плагины и темы (а также вы сами) могут добавлять собственные правила перезаписи поверх существующих в вашей (мультисайтовой) установке.
Решение от @swissspidy сработает, если у вас уже есть правило перезаписи для вашего ключа (myvar) и вы используете постоянные ссылки (permalinks) в первом условии, а затем переключаетесь на традиционные строки запроса (query strings) при отсутствии этих условий. Решение от @Johnathan Joosten демонстрирует, насколько сложными могут стать правила перезаписи в WordPress (представьте, что вам нужно сделать это для всех ключей и значений строк запроса...)
Я сталкивался с этой проблемой несколько раз при работе над средними проектами для клиентов и смог добиться похожего результата с помощью плагина под названием Obfusquer. Согласно сайту, он маскирует все строки запроса WordPress с помощью пользовательских секретных ключей и также предоставляет хуки для более сложных кастомных требований.
Забавно, что его нет в репозитории плагинов WordPress, и, думаю, вам понадобится подписка (которая, на мой взгляд, очень доступна, так как одна лицензия будет работать даже в мультисайтовой установке), но вот ссылка на него, если вам нужно замаскировать/скрыть строки запроса в WordPress. У них также есть документация здесь.
Теперь я использую этот плагин почти во всех своих проектах на WordPress, надеюсь, он поможет и вам. Удачи.
