Как получить красивые URL с помощью add_query_arg в постоянных ссылках


8

С add_query_arg()его помощью можно добавить дополнительные параметры к URL-адресу, а также легко создать правило перезаписи. Все идет нормально. Но проблема заключается в замене URL-адреса в WordPress.

Когда у меня есть URL, например:

www.mysite.com/?page_id=1&myvar=test

и я набираю этот 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

Как этого достичь? Я часами читал документы и не мог найти решение.


1
Я хотел бы знать, как это делается. +1 к вопросу.
Генрирайт

Ответы:


5

Просто столкнулся с такой же ситуацией и наткнулся на этот вопрос, пока гуглил.

Кажется, это невозможно. Само ядро ​​просто добавляет строки в URL, если включены красивые постоянные ссылки, см. Https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/link-template.php#L571.

Для тех, кто заинтересован в этом: Вы можете сделать что-то подобное в своем коде:

if ( '' != get_option('permalink_structure') ) {
    // using pretty permalinks, append to 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: https://make.wordpress.org/plugins/2012/06/07/rewrite-endpoints-api/#comment-686.


0

WordPress не позволит вам сделать это легко. На самом деле, правила перезаписи - это ваш единственный способ достичь такого рода вещей в WordPress, а правила переписывания WordPress могут сильно запутаться, когда ваш сайт растет, потому что плагины и темы (и вы тоже) могут добавлять собственные правила перезаписи над существующими правилами в вашем ) установка сайта.

Решение @swissspidy будет работать, если у вас уже есть правило перезаписи для вашего ключа (myvar) и вы используете постоянные ссылки в первом условии, а затем откат к традиционным строкам запроса в отсутствие этих условий. @Johnathan Решение Joosten показывает, как правила переписывания могут стать очень и очень сложными в WordPress (представьте, что вы делаете это для всех ключей и значений строки запроса ...)

Я сталкивался с этой проблемой несколько раз прежде, работая над некоторыми проектами среднего размера для моих клиентов, и я смог добиться чего-то подобного, используя плагин под названием Obfusquer. Согласно веб-сайту, он маскирует все строки запроса WordPress с определенными пользователем секретными ключами, а также предоставляет хуки для расширенных пользовательских требований.

Забавно, его нет в репозитории плагинов WordPress, и я думаю, что вам понадобится подписка (которая, я думаю, действительно доступна, так как 1 единая лицензия будет работать даже при многоузловой установке), но здесь есть ссылка на нее, если вам нужно замаскировать / скрыть строки запроса в установках WordPress. У них также есть документация здесь .

Сейчас я использую плагин почти во всех моих проектах WordPress, надеюсь, он поможет вам. Приветствия.


-1

Решение Wordpress было бы добавить правила переписывания, чтобы сделать что-то вроде этого:

    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


1
Вы должны были усложнить, чтобы понизить это ...
Вишал Кумар Саху
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.