Cómo pasar variables adicionales en URL con Wordpress


Estoy teniendo problemas al intentar pasar una variable adicional en la url a mi instalación de wordpress.

Por ejemplo /news?c=123

Por alguna razón, solo funciona en la raíz del sitio web www.example.com?c=123 pero no funciona si la url contiene más información www.example.com/news?c=123. Tengo el siguiente código en mis funciones.archivo php en el directorio del tema.

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

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

¿Alguna Idea?

Author: ajreal, 2011-01-03

8 answers

Hay muy pocas soluciones para abordar este problema. Primero puedes ir por un plugin si quieres:

O código manualmente, echa un vistazo a esta publicación:

También echa un vistazo:

 31
Author: Sarfraz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-03 17:52:23

Para hacer el viaje de ida y vuelta "a la manera de WordPress" en el "front-end" (no funciona en el contexto de wp-admin), debe usar 3 funciones de WordPress:

  • add_query_arg () - para crear la URL con su nueva variable de consulta ('c' en su ejemplo)
  • el filtro query_vars - para modificar la lista de variables de consulta pública que WordPress conoce (esto solo funciona en el front-end, porque la consulta WP no se usa en el back-end - wp-admin - so esto tampoco estará disponible en admin-ajax)
  • get_query_var() - para recuperar el valor de su variable de consulta personalizada pasada en su URL.

Nota: no hay necesidad de tocar los superglobales ($_GET) si lo haces de esta manera.

Ejemplo

En la página donde necesita crear el enlace / establecer la variable de consulta:

si se trata de un enlace a esta página, simplemente agregue la consulta variable

<a href="<?php echo esc_url( add_query_arg( 'c', $my_value_for_c ) )?>">

si es un enlace a alguna otra página

<a href="<?php echo esc_url( add_query_arg( 'c', $my_value_for_c, site_url( '/some_other_page/' ) ) )?>">

En sus funciones.php, o algún archivo plugin o clase personalizada (solo front-end):

function add_custom_query_var( $vars ){
  $vars[] = "c";
  return $vars;
}
add_filter( 'query_vars', 'add_custom_query_var' );

En la página / función donde desea recuperar y trabajar con el var de consulta establecido en su URL:

$my_c = get_query_var( 'c' );

En el extremo posterior (wp-admin)

En el back-end nunca ejecutamos wp(), por lo que la consulta WP principal no se ejecuta. Como resultado, no hay query vars y el gancho query_vars no se ejecuta.

En este caso, tendrá que volver al enfoque más estándar de examinar su $_GET superglobal. La mejor manera de hacer esto es probablemente:

$my_c = filter_input( INPUT_GET, "c", FILTER_SANITIZE_STRING );

Aunque en un apuro podrías hacer lo probado y verdadero

$my_c = isset( $_GET['c'] ? $_GET['c'] : "";

O alguna variante del mismo.

 94
Author: Tom Auger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-19 19:57:28

Agregue el siguiente código en la función.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;
}

Entonces podrás usar $_GET['var1']

 14
Author: shankhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-03 17:52:17

Dado que esta es una publicación frecuentemente visitada, pensé en publicar mi solución en caso de que ayude a alguien. En WordPress, junto con el uso de vars de consulta, también puede cambiar los enlaces permanentes de esta manera

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

Para esto hay que añadir estas líneas de código en funciones.php o su archivo base de plugin.

De shankhan 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;
}

Y además esto se recortó para agregar reglas de reescritura personalizadas.

function custom_rewrite_basic() 
{
    add_rewrite_rule('^c/([0-9]+)/?', '?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');

Para el caso en el que necesita agregar reescritura reglas para una página específica puede usar ese slug de página para escribir una regla de reescritura para esa página específica. Como en la pregunta que OP ha hecho sobre

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

Podemos cambiarlo al comportamiento deseado agregando una pequeña modificación a nuestra función anterior.

function custom_rewrite_basic() 
{
    add_rewrite_rule('^news/([0-9]+)/?', 'news?c=$1', 'top');
}
add_action('init', 'custom_rewrite_basic');

Esperando que sea útil para alguien.

 7
Author: shazyriver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-13 05:24:01
<?php
$edit_post = add_query_arg('c', '123', 'news' );

?>

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

Puede agregar cualquier página en lugar de "noticias".

 1
Author: user3777827,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-09 12:05:11

Un problema que podría encontrar es que is_home() devuelve true cuando un query_var registrado está presente en la URL de inicio. Por ejemplo, si http://example.com muestra una página estática en lugar del blog, http://example.com/?c=123 devolverá el blog.

Véase https://core.trac.wordpress.org/ticket/25143 y https://wordpress.org/support/topic/adding-query-var-makes-front-page-missing / para más información sobre esto.

Lo que puede hacer (si no está intentando afectar la consulta) es usar add_rewrite_endpoint(). Debería se ejecutará durante la acción init ya que afecta a las reglas de reescritura. Eg.

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

Esto debería darte acceso a $_GET['c'] cuando la url contenga más información como www.example.com/news?c=123.

Recuerde limpiar sus reglas de reescritura después de agregar/modificar esto.

 1
Author: niall.campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-19 06:30:54

Esta era la única manera en que podía hacer que esto funcionara

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

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

 0
Author: brenjt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-26 17:52:38

Para agregar parámetro a la url de post (al enlace perma), utilizo esto:

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

Salida:

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

 0
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-01 14:00:19