Если щелкнуть одну публикацию на странице категории или, если на то пошло, любую страницу, вы можете получить URL этого реферера и проанализировать его, чтобы получить строку запроса. Но это работает только со структурой постоянной ссылки по умолчанию
Пример, когда рефералом является страница категории:
A var_dump( parse_url( wp_get_referer() ) );
дает следующий вывод со структурой постоянной ссылки по умолчанию
array(4) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(11) "/wordpress/"
["query"]=>
string(5) "cat=7"
}
С тем же var_dump()
с постоянными ссылками, установленными на /%postname%/
, это то, что вы получаете
array(3) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(32) "/wordpress/category/uit-my-lewe/"
}
Я могу использовать path
из второго блока кода с get_category_by_path()
, я могу получить объекты категории
Моя проблема в том, как мне поступить так с точки зрения таксономии.
Я сделал тест. У меня есть таксономия event_cat
. Если я переписываю это event-slug
, я получаю следующее, path
используя/%postname%/
качестве структуры постоянной ссылки
/wordpress/event-slug/5-star/
и
event_cat=5-star
используя структуру по умолчанию
Автоматически мое имя таксономии не будет в URL, просто слизняк моего термина. Таким образом, это не будет очень надежный метод получения объектов из термина.
Мой вопрос заключается в том, как правильно получить структуру постоянных ссылок по умолчанию, получить строку запроса, или строку запроса, или таксономию и название термина из /%postname%/
структуры постоянной ссылки.
источник
Ответы:
Прежде всего, я должен сказать, что
wp_get_referer()
это не на 100% надежно, потому что полагается на$_SERVER['HTTP_REFERER']
это, не на 100% надежно, из документации php.net :Альтернативное решение
Если вы можете добавить к URL-адресу публикации аргумент запроса, в котором указано, откуда поступило сообщение, оно будет более надежным, и вам не нужно анализировать URL-адрес, чтобы получить объект термина.
Пример:
При этом, постоянные ссылки на странице категории, на которые вы нажали, отправят вам ссылку
И вы можете легко понять, откуда приходит пользователь, не полагаясь на него
$_SERVER['HTTP_REFERER']
и без каких-либо других усилий.Ответь на свой вопрос
Получение информации о запросе, начиная с URL, - это то, что WordPress делает внутри
WP::parse_request()
метода.Этот метод предназначен для использования только один раз и только для «основного» URL (URL, который просматривает пользователь), а не для произвольных URL.
Несколько месяцев назад я написал плагин Url To Query с целью сделать то же самое для произвольных URL.
Что я сделал, так это взял
WP::parse_request()
и реорганизовал его в более разумный код ООП и заставил работать с произвольными URL-адресами (например, URL-адрес для обработки принимается в качестве аргументов, а не из$_SERVER
вар).Используя мой плагин вы можете
Таким образом, вы получаете аргументы запроса (то, что вы можете прямо передать
new WP_Query
), начиная с URL, это именно то, чтоWP::parse_request()
делает.В вашем случае вы, вероятно, могли бы проверить массив args без необходимости фактически выполнять запрос.
Это, безусловно, может сработать, однако я думаю, что дополнительные усилия, необходимые для анализа URL-адреса и ненадежности,
$_SERVER['HTTP_REFERER']
делают первое решение лучше для ваших целей.источник
Первоначально целью этого вопроса было выяснить, откуда был отослан один пост, и затем, в соответствии с этим, поделить следующие и предыдущие посты в соответствии с рефералом.
То, что я хотел сделать, например:
Нажатие на публикацию на странице категории, таксономии, тега, поиска или авторского архива. Эти архивы служат справочниками. Теперь обычно можно использовать, как в моем вопросе,
wp_get_referer()
чтобы получить этот реферер и использовать его в дальнейших запросах. Как описано @GM в его принятом ответе выше , этот метод ненадежен , поэтому я пошел и использовал его Альтернативное решение .Другая проблема заключалась в необходимости использования какого-либо файла cookie или сеанса для хранения этого реферера, чтобы вы все равно собирали записи из исходного реферера, когда уходите от оригинального отдельного поста, который был выбран из определенного архива. Поскольку cookie-файлы также контролируются конечным пользователем и, следовательно, ненадежны, а также тот факт, что WordPress не использует сеансы по умолчанию, я реорганизовал ссылки на следующую и предыдущую публикацию, используя @GM Alternative Solution чтобы иметь надежный способ проверки и хранения моего оригинала. реферер.
Это то, что я придумал, и я надеюсь, что кто-то найдет это полезным в ближайшем будущем. Пожалуйста, используйте и злоупотребляйте кодом, чтобы соответствовать вашим потребностям, только один запрос: оставьте ссылку на этот вопрос. :-)
ЗАМЕЧАНИЯ ПО КОДУ
Этот код довольно длинный и интенсивный, поэтому я не буду вдаваться в подробности. Код был хорошо прокомментирован
Этот код имеет опцию для постинга между постами в пределах одного и того же термина, как по умолчанию
next_post_link()
иprevious_post_link()
функций в WordPress. Так же, как нативные функции, вы должны установить таксономию. Значение по умолчанию дляin_same_term
,true
а таксономияcategory
Самое главное, этот код требует PHP 5.4+
КОД
ИСПОЛЬЗОВАНИЕ В ОДНОМ ШАБЛОНЕ
Если вам не нужно перемещаться по сообщениям в течение одного и того же термина, получать сообщения всех типов и настраивать следующий и предыдущий текст по вашей ссылке, вы можете сделать следующее:
РЕДАКТИРОВАТЬ 1
По запросу из поста на SO и в качестве части
@todo
я теперь ввел поддержку не только для навигации между постами из типа поста текущего поста, но и из массива типов постов, установленных пользователем с помощьюpost_types
параметра в функции. Пожалуйста, смотрите обновленный код.РЕДАКТИРОВАТЬ 2
Добавьте
'suppress_filters' => true,
кWP_Query
аргументам, чтобы нумерация страниц не изменялась никакими фильтрами, используемыми вWP_Query
источник