Как передать дополнительные переменные в URL с Wordpress



у меня возникли проблемы с попыткой передать дополнительную переменную в url-адрес моей установки wordpress.



/news?c=123

Почему-то он работает только на сайте root www.example.com?c=123 но это не работает, если url содержит больше информации www.example.com/news?c=123. У меня есть следующий код в моей функции.php-файл в директории темы.



if (isset($_GET['c'])) 
{
setcookie("cCookie", $_GET['c']);
}

if (isset($_SERVER['HTTP_REFERER']))
{
setcookie("rCookie", $_SERVER['HTTP_REFERER']);
}


Какие Идеи?

1004   8  

8 ответов:

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

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

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

чтобы сделать туда и обратно "путь WordPress" на "front-end" (не работает в контексте wp-admin), вам нужно использовать 3 функции WordPress:

  • add_query_arg () - чтобы создать URL-адрес с новой переменной запроса ('c' в вашем примере)
  • the query_vars фильтр-для изменения списка открытые переменные запроса что WordPress знает о (это работает только на переднем конце, потому что запрос WP не используется на задней части - 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/' ) ) )?>">

в ваши функции.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'] : "";

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

добавить следующий код в функцию.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 вы можете изменить постоянные ссылки тоже так

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

для этого вы должны добавить следующие строки кода в функции.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=', 'top');
}
add_action('init', 'custom_rewrite_basic');

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

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

мы можем изменить его на желаемое поведение, добавив небольшую модификацию к нашей предыдущей функции.

function custom_rewrite_basic() 
{
    add_rewrite_rule('^news/([0-9]+)/?', 'news?c=', '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, когда зарегистрированный 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.

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

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

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

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

до добавить параметр для публикации url (к ссылке perma), я использую это:

add_filter( 'post_type_link', 'append_query_string', 10, 2 );
function append_query_string( $url, $post ) 
{
    return $url.'?my_pid='.$post->ID;
}

выход:

http://yoursite.com/pagename?my_pid=12345678

Comments

    Ничего не найдено.