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

20 дек. 2013 г., 10:55:20
Просмотры: 18K
Голосов: 10

С помощью 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

Как этого добиться? Я потратил часы на изучение документации, но так и не нашел решения.

1
Комментарии

Хотелось бы узнать, как это делается. +1 к вопросу.

henrywright henrywright
27 дек. 2013 г. 23:04:20
Все ответы на вопрос 3
0

Только что столкнулся с такой же ситуацией и наткнулся на этот вопрос во время поиска в 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

10 июл. 2014 г. 20:14:30
1

Решение для 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

16 февр. 2017 г. 11:05:53
Комментарии

Вам следовало сделать так, чтобы поставить минус было сложнее...

Vishal Kumar Sahu Vishal Kumar Sahu
25 мар. 2017 г. 07:07:40
0

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

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

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

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

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

27 нояб. 2019 г. 12:23:06