2010-06-27 15 views
66

Deseo obtener el ID de página antes de iniciar el ciclo en Wordpress. Estoy usandoWordpress Obtenga el ID de página fuera del ciclo

$page = get_query_var('page_id');

Al parecer, no devuelve nada.

Solo quiero comprobar una página para su ID y agregar una clase a la etiqueta <body> basada en ella.

+3

http://stackoverflow.com/questions/22351038/get-the-current-page-id-inside-wordpress-plugin- página/ –

Respuesta

141

Si está utilizando enlaces permanentes bonitos, get_query_var('page_id') no funcionará.

En su lugar, obtener el ID de objeto consultada del $wp_query mundial:

// Since 3.1 - recommended! 
$page_object = get_queried_object(); 
$page_id  = get_queried_object_id(); 


// "Dirty" pre 3.1 
global $wp_query; 

$page_object = $wp_query->get_queried_object(); 
$page_id  = $wp_query->get_queried_object_id(); 
+0

Perfecto para enlaces permanentes bonitos. Usé global $ post; echo $ post-> ID; Pero no funcionó eso. ¡Gracias! –

+4

'get_queried_object_id();' devuelve 0 para mí. Creo que el problema es que lo estoy llamando después de una consulta personalizada. Quiero de la página real Id. – Victor

+0

Extraño, 'get_queried_object();' no funcionó para mí, pero '$ wp_query-> get_queried_object();' sí ... Eché un vistazo al 'get_queried_object();' y es lo mismo que hacer el último. – SeanJA

0

Puede usar is_page($page_id) fuera del circuito para verificar.

+0

I No quiero verificar una página, quiero obtener la ID de la página actual. –

+0

@atif ¿está seguro de que se está pasando una identificación de página? ¿No estás en la primera página? –

+0

sí Lo compruebo –

5

Utilice esta $ post mundial en su lugar:

global $post; 
echo $post->ID; 
+0

Esto solo funcionará después del ciclo, no antes, ya que '$ post' se inicializa al iniciar" el ciclo ". –

+6

@ ChristianDavén - esto no es verdad. Este código funciona al comienzo de la página.php – CroiOS

0

Esta función llegar Identificación de una página actual.

get_the_ID(); 
+4

um ... esto solo funciona si está [en el ciclo] (http://codex.wordpress.org/Function_Reference/get_the_ID): _Returna la identificación numérica del publicación actual. ** Esta etiqueta debe estar dentro de The Loop. ** _ – drzaus

+0

@drzaus En realidad, esto funciona fuera del ciclo ... Compruébalo. – hitautodestruct

+1

@hitautodestruct, si bien usted tiene la seguridad técnica de que podría funcionar fuera del ciclo, no es un uso confiable, esto es por experiencia personal y también por el código fuente. El método subyacente [get_post] (https://core.trac.wordpress.org/browser/tags/4.1.1/src/wp-includes/post.php#L417) pasa a usar '$ GLOBALS ['post'] ', que podría haberse poblado en algún momento, pero no hay garantía _unless/hasta_ estás en el circuito. – drzaus

-4

Este es el código correcto.

echo $post->ID; 
4

Si por cualquier medio buscado este tema debido a la página de entrada (página índice alternativo al utilizar portada estática), entonces la respuesta correcta es la siguiente:

if (get_option('show_on_front') == 'page') { 
    $page_id = get_option('page_for_posts'); 
    echo get_the_title($page_id); 
} 

(tomado de Forrst | Echo WordPress "Posts Page" title - Some code from tammyhart)

-4

Si está fuera del Loop de WordPress no puede usar ninguno de los métodos de wordpress, por lo que debe usar php puro.

Puede usar este código. Y seguro le ayudará :)

$page_id = @$_GET['page_id']; 

if (!is_numeric($page_id)) { 
    // Then the uri must be in friendly format aka /my_domain/category/onepage/ 
    // Try this 
    //$path = '/www/public_html/index.php/'; 
    ///$path = '/my_domain/category/onepage/'; 
    $path = $_SERVER['REQUEST_URI']; 
    // Clean the uri 
    //$path = str_replace('/', '', $page); 
    $path = str_replace('.php', '', $path); 
    //$path = str_replace('?s=', '', $path); 
    $path = $path ? $path : 'default'; 

    $path_len = strlen($path); 
    $last_char = substr($path, $path_len -1); 
    //echo $last_char; 
    $has_slash = strpos($last_char, "/"); 
    //echo $has_slash; 
    if ($has_slash === 0) : 
     $path = substr($path, 0, $path_len -1); 
    elseif ($has_slash === null) : 
     $path = substr($path, 0, $path_len); 
    endif; 
    //echo "path: ".$path; // '/www/public_html/index' 
    $page = substr(strrchr($path, "/"), 1); 
    echo "page: ".$page; // 'index' 
} 

$my_page_id = 31; 
$my_page = 'mypage'; 

//echo "page: ".$page; 
//echo "page_id ".$page_id; 
if($page_id == $my_page_id || $page == $my_page) 
{ 
    // your stuff.... 
} 

Enjoy!

+2

Muy mal en todos los sentidos. – JakeParis

+0

Quizás ... ¿Podría dar más detalles al respecto y mostrarme su solución? – edcv

+1

escribiste 50 líneas de código para obtener la variable que ya existe en '$ post-> ID'. Incluso si no está al tanto, puede usar muchas, muchas funciones de Wordpress. Simplemente no los pocos que deben usarse en el ciclo. – JakeParis

7

También puede crear una función genérica para obtener el ID del post, si su exterior o en el interior del bucle (asas ambos casos):

<?php 

/** 
* @uses WP_Query 
* @uses get_queried_object() 
* @see get_the_ID() 
* @return int 
*/ 
function get_the_post_id() { 
    if (in_the_loop()) { 
     $post_id = get_the_ID(); 
    } else { 
     global $wp_query; 
     $post_id = $wp_query->get_queried_object_id(); 
     } 
    return $post_id; 
} ?> 

y simplemente hacer:

$page_id = get_the_post_id(); 
+0

¿esto realmente funciona? es una función infinitamente recursiva o se romperá porque 'get_the_ID' es una función ya declarada. Creo que quisiste cambiar el nombre de la función, ¿o era parte de una clase? – drzaus

+0

@drzaus gracias por señalar eso. Lo arreglé. –

0

uso por debajo de dos líneas de código para obtener la página actual o posterior Identificación

global $post; 
echo $post->ID; 
0

Si estás en una página y esto no lo hace trabajo:

$page_object = get_queried_object(); 
$page_id  = get_queried_object_id(); 

se puede tratar de construir el enlace permanente manualmente con PHP para que pueda buscar el ID del anuncio:

// get or make permalink 
$url = !empty(get_the_permalink()) ? get_the_permalink() : (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; 
$permalink = strtok($url, '?'); 

// get post_id using url/permalink 
$post_id = url_to_postid($url); 

// want the post or postmeta? use get_post() or get_post_meta() 
$post = get_post($post_id); 
$postmeta = get_post_meta($post_id); 

puede que no sea posible captar cada enlace permanente (especialmente ya que estoy excluyendo el cadena de consulta), pero puede modificarlo para que se ajuste a su caso de uso.

0

Lo he hecho de la siguiente manera y me ha funcionado perfectamente.

En primer lugar declarado una variable global en el header.php, asignar el ID de la entrada o página antes de que cambie, ya que el BUCLE asigna el ID de la última entrada se muestra:

$GLOBALS['pageid] = $wp_query->get_queried_object_id();

Y para usar en cualquier parte de la plantilla, en el ejemplo footer.php:

echo $GLOBALS['pageid];

Cuestiones relacionadas