Как передать дополнительные переменные в URL с помощью WordPress - PullRequest
63 голосов
/ 03 января 2011

У меня проблемы с попыткой передать дополнительную переменную в URL моей установке WordPress.

Например /news?c=123

По какой-то причине он работает только в корне сайта 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']);
}

Есть идеи?

Ответы [ 8 ]

102 голосов
/ 21 августа 2013

Чтобы совершить круговую поездку «Путь WordPress» на «front-end» (не работает в контексте wp-admin), вам нужно использовать 3 функции WordPress:

  • add_query_arg () - чтобы создать URL с новой переменной запроса (в вашем примере 'c')
  • фильтр query_vars - для изменения списка общедоступных переменных запроса , о которых знает WordPress (это работает только во внешнем интерфейсе, поскольку запрос WP не используется в back end - wp-admin - так что это также не будет доступно в admin-ajax)
  • get_query_var () - чтобы получить значение переменной пользовательского запроса, переданной в вашем URL.

Примечание: нет необходимости даже прикасаться к суперглобалам ($_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'] : "";

или некоторый его вариант.

31 голосов
/ 03 января 2011

Существует довольно мало решений для решения этой проблемы.Сначала вы можете выбрать плагин, если хотите:

Или код вручную, проверьте этот пост:

Также проверьте:

15 голосов
/ 03 января 2011

добавить следующий код в 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']

9 голосов
/ 29 июля 2017

Так как это часто посещаемое сообщение, я решил опубликовать свое решение на случай, если оно кому-нибудь поможет. В WordPress наряду с использованием переменных запросов вы также можете изменить постоянные ссылки следующим образом:

www.example.com?c=123 to www.example.com/c/123

Для этого вам нужно добавить эти строки кода в functions.php или в базовый файл вашего плагина.

С Шанкхана anwer

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');

В случае, когда вам нужно добавить правила перезаписи для конкретной страницы, вы можете использовать этот плагин страницы, чтобы написать правило перезаписи для этой конкретной страницы.Как и в вопросе, который OP задавал о

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');

Надеясь, что онастановится полезным для кого-то.

3 голосов
/ 09 июля 2014
<?php
$edit_post = add_query_arg('c', '123', 'news' );

?>

<a href="<?php echo $edit_post; ?>">Go to New page</a>

Вы можете добавить любую страницу вместо «новостей».

2 голосов
/ 19 октября 2017

Одна из проблем, с которой вы можете столкнуться, это is_home(), возвращает true, если зарегистрированный query_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.

Не забудьте сбросить правила переписывания после добавления / изменения этого.

1 голос
/ 01 апреля 2014

до добавить параметр для публикации 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

1 голос
/ 26 сентября 2012

Это был единственный способ заставить это работать

add_action('init','add_query_args');
function add_query_args()
{ 
    add_query_arg( 'var1', 'val1' );
}

http://codex.wordpress.org/Function_Reference/add_query_arg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...