У меня возникли проблемы с попыткой передать дополнительную переменную в URL-адрес моей установки wordpress.
Например /news?c=123
По какой-то причине он работает только на веб-сайте root www.example.com?c=123
, но он не работает, если URL-адрес содержит больше информации www.example.com/news?c=123
. У меня есть следующий код в файле functions.php в каталоге тем.
if (isset($_GET['c']))
{
setcookie("cCookie", $_GET['c']);
}
if (isset($_SERVER['HTTP_REFERER']))
{
setcookie("rCookie", $_SERVER['HTTP_REFERER']);
}
Любые идеи?
Решить эту проблему довольно мало. Сначала вы можете выбрать плагин, если хотите:
Или код вручную, проверьте этот пост:
Также проверьте:
Чтобы сделать обратный путь "Путь WordPress" на "front-end" (не работает в контексте wp-admin
), вам нужно использовать 3 функции WordPress:
wp-admin
- поэтому это также будет недоступно в admin-ajax
)Примечание: нет необходимости даже касаться суперглобалов ($_GET
), если вы сделаете это так.
На странице, где вам нужно создать ссылку/установить переменную запроса:
если он ссылается на эту страницу, просто добавив переменную запроса
<a href="<?php echo esc_url( add_query_arg( 'c', $my_value_for_c ) )?>">
если это ссылка на другую страницу
<a href="<?php echo esc_url( add_query_arg( 'c', $my_value_for_c, site_url( '/some_other_page/' ) ) )?>">
В вашем файле functions.php или в каком-либо файле плагина или в специальном классе (только для интерфейсов):
function add_custom_query_var( $vars ){
$vars[] = "c";
return $vars;
}
add_filter( 'query_vars', 'add_custom_query_var' );
На странице/функции, где вы хотите получить и работать с запросом var, указанным в URL-адресе:
$my_c = get_query_var( 'c' );
wp-admin
)На задней панели мы никогда не запускаем wp()
, поэтому основной запрос WP не запускается. В результате нет query vars
, а query_vars
не запускается.
В этом случае вам нужно будет вернуться к более стандартным подходам к проверке вашего супертонбала $_GET
. Лучший способ сделать это, вероятно:
$my_c = filter_input( INPUT_GET, "c", FILTER_SANITIZE_STRING );
хотя в крайнем случае вы могли бы выполнить проверенный и достоверный
$my_c = isset( $_GET['c'] ? $_GET['c'] : "";
или его вариант.
esc_url
с add_query_arg
developer.wordpress.org/reference/functions/add_query_arg
добавить следующий код в function.php
add_filter( 'query_vars', 'addnew_query_vars', 10, 1 );
function addnew_query_vars($vars)
{
$vars[] = 'var1'; // var1 is the name of variable you want to add
return $vars;
}
то вы сможете использовать $_GET ['var1']
Так как это часто посещаемый пост, я думал опубликовать свое решение, если оно помогает кому-либо. В WordPress наряду с использованием запросов vars вы также можете изменить permalinks так:
www.example.com?c=123 to www.example.com/c/123
Для этого вам нужно добавить эти строки кода в файл functions.php или ваш основной файл плагина.
От shankhan
add_filter( 'query_vars', 'addnew_query_vars', 10, 1 );
function addnew_query_vars($vars)
{
$vars[] = 'c'; // c is the name of variable you want to add
return $vars;
}
И, кроме того, это отключено, чтобы добавить пользовательские правила перезаписи.
function custom_rewrite_basic()
{
add_rewrite_rule('^c/([0-9]+)/?', '?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');
В случае, когда вам нужно добавить правила перезаписи для страницы с конкретными параметрами, вы можете использовать эту страницу для написания правила перезаписи для этой конкретной страницы. Как и в вопросе, о котором спрашивал О.
www.example.com/news?c=123 to www.example.com/news/123
Мы можем изменить его на желаемое поведение, добавив небольшую модификацию к нашей предыдущей функции.
function custom_rewrite_basic()
{
add_rewrite_rule('^news/([0-9]+)/?', 'news?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');
Надеясь, что это станет полезным для кого-то.
<?php
$edit_post = add_query_arg('c', '123', 'news' );
?>
<a href="<?php echo $edit_post; ?>">Go to New page</a>
Вы можете добавить любую страницу в "новости".
Одна проблема, с которой вы можете столкнуться, - это is_home()
возвращает true, когда зарегистрированный запрос_var присутствует в домашнем URL-адресе. Например, если http://example.com
отображает статическую страницу вместо блога, http://example.com/?c=123
вернет блог.
См. https://core.trac.wordpress.org/ticket/25143 и https://wordpress.org/support/topic/adding-query-var-makes-front-page-missing/ для получения дополнительной информации об этом.
Что вы можете сделать (если вы не пытаетесь повлиять на запрос), используйте add_rewrite_endpoint()
. Он должен запускаться во время действия init
, поскольку он влияет на правила перезаписи. Например.
add_action( 'init', 'add_custom_setcookie_rewrite_endpoints' );
function add_custom_setcookie_rewrite_endpoints() {
//add ?c=123 endpoint with
//EP_ALL so endpoint is present across all places
//no effect on the query vars
add_rewrite_endpoint( 'c', EP_ALL, $query_vars = false );
}
Это должно дать вам доступ к $_GET['c']
, когда URL-адрес содержит больше информации, например www.example.com/news?c=123
.
Не забудьте сбросить правила перезаписи после добавления/изменения этого параметра.
Это был единственный способ заставить это работать
add_action('init','add_query_args');
function add_query_args()
{
add_query_arg( 'var1', 'val1' );
}
чтобы добавить параметр для публикации URL (для ссылки на Perma), я использую это:
add_filter( 'post_type_link', 'append_query_string', 10, 2 );
function append_query_string( $url, $post )
{
return add_query_arg('my_pid',$post->ID, $url);
}
выход:
http://yoursite.com/pagename?my_pid=12345678