La función get_query_var no funciona en absoluto

28 jun 2013, 11:34:36
Vistas: 28.5K
Votos: 6

Sí, hay algunos temas similares sobre esta función, get_query_var('paged') devolviendo el mismo resultado

la ordenación de posts del blog no funciona al usar get_query_var

Estoy usando WordPress 3.5, tengo mi propio sistema basado en PHP MySQL, y necesito integrar una función de blog, solo necesito listar los últimos posts en un archivo PHP separado ordenado por fecha de post. Básicamente, mis requerimientos son simples:

listar todos los posts en un archivo php, supongamos que este archivo se llama blog_show.php

Como usaré la API de WordPress fuera de WordPress, necesito importar WordPress primero, puedes encontrar la forma aquí Integración de WordPress con tus sitios

Aquí hay parte de mi blog_show.php

define('WP_USE_THEMES', false);
require_once '../blog/wp-load.php';

global $wp_query;
wp_reset_query();

$current_page = (get_query_var('p')) ? get_query_var('p') : 1;

$query_args = array(
    'orderby' => 'date',
    'order' => 'DESC',
    'post_type' => 'post', 
    'post_status' => 'publish',
    'posts_per_page' => 2,
    'paged' => $current_page,
    //'add_args' => true

);
$lateset_posts = new WP_Query($query_args);


$paging_args = array(
    'base'         => '%_%',
    'format'       => '?p=%#%',
    'total'        => 10,
    'current'      => $current_page,
    'end_size'     => 1,
    'mid_size'     => 1,
    'prev_next'    => True,
    'prev_text'    => __('« Anterior'),
    'next_text'    => __('Siguiente »')
);
$lateset_posts_paging = paginate_links($paging_args);

Todo está bien, puedo usar

$lateset_posts = new WP_Query($query_args);

para encontrar los posts que quiero. Pero no puedo usar

get_query_var('p')

Siempre obtengo el mismo valor. Y descubrí que incluso declarando wp_query como global, aún no se puede usar, casi todos los campos de wp_query son null.

Debido a que get_query_var('p') y $wp_query no se pueden usar, mi paginación tampoco funciona.

Como pueden ver, la variable p solo se usa en dos lugares

$current_page = (get_query_var('p')) ? get_query_var('p') : 1;
$query_args = array(
       //algo
       'paged' => $current_page,
    );

y

$paging_args = array(
        'base'         => '%_%',
        'format'       => '?p=%#%', //P está aquí
        'total'        => 10,
        'current'      => $current_page,
        'end_size'     => 1,
        'mid_size'     => 1,
        'prev_next'    => True,
        'prev_text'    => __('« Anterior'),
        'next_text'    => __('Siguiente »')
    );

He hecho una prueba, incluso cambiando p a paged o cualquier otra cosa, sigo obteniendo el mismo error.

¿Dónde me equivoco, necesito requerir algunos archivos PHP adicionales? Gracias.

2
Comentarios

¿Registraste la variable p como query_var en algún lugar de tu código? El query_var predeterminado para la paginación es paged.

Krzysiek Dróżdż Krzysiek Dróżdż
28 jun 2013 11:38:58

@KrzysiekDróżdż Usé p en dos lugares, como ves paged' => get_query_var('p') y 'format' => '?p=%#%'. ¿Dónde debería registrarlo?

diligent diligent
28 jun 2013 11:46:25
Todas las respuestas a la pregunta 1
0
19

WordPress no añade automáticamente todos los parámetros de cadena de consulta (parámetros $_GET) como query_vars.

Cuando la variable de consulta somevar no está registrada: ejemplo.com/alguna-pagina/?somevar=hola - WordPress ignora somevar

Cuando la variable de consulta somevar está registrada: ejemplo.com/alguna-pagina/?somevar=hola - WordPress almacena el valor de este parámetro en el array $wp_query->query_vars

La diferencia entre registrar esa variable con WordPress es si el valor se almacena en el objeto WP_Query.. (debería seguir estando disponible via $_GET independientemente).

Para registrar tu variable de consulta personalizada, deberías usar:

add_filter('query_vars', 'add_my_var');
function add_my_var($public_query_vars) {
    $public_query_vars[] = 'identificador_unico_para_tu_variable';
    return $public_query_vars;
}

También ten cuidado de no usar nombres de query_var por defecto de WordPress - probablemente tendrás conflictos en ese caso, supongo.

28 jun 2013 11:56:40