Cómo obtener el nombre de la página actual en WordPress?


¿Qué código php se puede utilizar para recuperar el nombre de la página actual en un tema de WordPress?

Todas las soluciones que he visto hasta ahora(the_title(), get_page()->post_name, get_post(), etc) no funciona para una página que contiene entradas de post. Todos ellos devolverán el nombre de la última entrada del blog.

Dicho de otra manera, supongamos que tiene una página creada en WordPress con el nombre "Mis noticias". Esta página está configurada como la "página de publicación". Añade un par de posts a la página. Ahora, qué API se puede usar para recuperar la cadena "mi-noticias" en lugar del nombre de la última publicación?

Editar:

He encontrado la siguiente variable que parece funcionar.

$wp_query->queried_object->post_name

Esta es en realidad la versión amigable URL del nombre de la página (slug), que es lo que yo también estaba buscando. Esto se probó con la plantilla predeterminada (twentyten). Realmente no estoy seguro de por qué las dos variables que se indican a continuación no funcionan en mi sitio. Gracias keatch por el consejo print_r().

Ahora, ¿por qué esta información está escondida tan profundamente?

Author: ivan_pozdeev, 2011-01-29

18 answers

La variable global WP $pagename debería estar disponible para usted, acabo de probar con la misma configuración que especificó.

$pagename se define en el archivo wp-includes / theme.php, dentro de la función get_page_template(), que por supuesto se llama antes de que se analicen los archivos de tema de su página, por lo que está disponible en cualquier punto dentro de sus plantillas para páginas.

EDITAR:

  • Aunque no parece estar documentado, el var $pagename solo se establece si utiliza enlaces permanentes. Supongo esto se debe a que si no los usas, WP no necesita el slug de la página, por lo que no lo configura.

  • $pagename no se establece si utiliza la página como portada estática.

  • Este es el código dentro de /wp-includes/theme.php, que usa la solución que señalaste cuando $pagename no se puede establecer:

    $pagename = get_query_var('pagename');  
    if ( !$pagename && $id > 0 ) {  
        // If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object  
        $post = $wp_query->get_queried_object();  
        $pagename = $post->post_name;  
    }
    
 162
Author: AJJ,
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
2015-04-06 14:12:40

Mi enfoque para obtener el nombre de la babosa de la página

$slug = basename(get_permalink());
 31
Author: goksel,
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
2013-04-02 13:45:00

Ok, debes agarrar el título de la página ANTES del bucle.

$page_title = $wp_query->post->post_title;

Compruebe la referencia: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

Hacer un

print_r($wp_query)

Antes del bucle para ver todos los valores de object wp_query object

 21
Author: keatch,
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-29 15:09:59
<?php wp_title(''); ?>

Esto funcionó para mí, si entiendo correctamente, ¿desea obtener el nombre de la página en una página que tenga entradas de post?

 16
Author: GregB,
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-03-10 17:24:54

Puede obtener el tipo de página, publicación o publicación personalizada actual con la variable global post post.

echo $post->post_title

Nota: En una función o clase necesitarás especificar global $post; antes de intentar usar post post.

Si tiene bucles en su página, asegúrese de terminar cada bucle con wp_reset_postdata(); para volver a establecer post post en el elemento predeterminado que se muestra (la página).

Tenga en cuenta que la variable 'post_title' también está disponible para cualquier bucle / consulta personalizada.. incluyendo elementos de menú y archivos adjuntos de medios.. todo en WordPress es un 'post'.

 7
Author: James,
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-03-09 02:46:23

Si está buscando acceder a la página actual desde sus funciones.archivo php (entonces, antes de el bucle, antes de $post se rellena, antes de $wp_query se inicializa, etc...) realmente no tiene más remedio que acceder a las variables del servidor y extraer la página solicitada de la cadena de consulta.

$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )

Tenga en cuenta que esta es una solución "tonta". No sabe, por ejemplo, que la página con el slug 'coming-soon' también es p=6. Y asume que su configuración de enlace permanente se establecen en pagename (que deberían ser de todos modos!).

Aún así, puede ser un pequeño truco útil si tiene un escenario controlado. Estoy usando esto en una situación en la que deseo redirigir a los visitantes no registrados a una página "próximamente"; pero tengo que asegurarme de que no los estoy lanzando al temido "bucle de redirección", por lo que necesito excluir la página" próximamente " de esta regla:

global $pagenow;
if (
        ! is_admin() &&
        'wp-login.php' != $pagenow &&
        'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
        ! is_user_logged_in()
){
   wp_safe_redirect( 'coming-soon' );
}
 6
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
2013-04-04 20:57:31

Prueba esto:

$pagename = get_query_var('pagename');
 5
Author: Mohammad Sabbagh,
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-10 11:27:17

He llegado a una solución más simple.

Obtenga el valor devuelto del nombre de la página de wp_title(), si está vacío, imprima el nombre de la página de inicio, de lo contrario haga eco del valor de wp_title.

<?php $title = wp_title('',false); ?>

Recuerde eliminar la separación con arg primero y luego establecer display en false para usarlo como entrada a la variable. a continuación, acaba de poner el código entre su título, etc. Tags.

<?php if ( $title == "" ) : echo "Home"; else : echo $title; endif; ?>

Funcionó un placer para mí y asegurando que el primero se declare en la sección donde desea extraer el extract title, esto se puede ajustar para devolver diferentes variables.

[email protected]

 5
Author: Tech1337,
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
2013-09-09 02:42:46

Creo que el tema de inicio Roots tiene una función fantástica para obtener el título de la página actual, muy hackeable, cubre todas las bases y se puede usar fácilmente con el gancho wp_title

Https://github.com/roots/roots/blob/6.5.0/lib/titles.php .

/**
 * Page titles
 */
function roots_title() {
  if (is_home()) {
    if (get_option('page_for_posts', true)) {
      echo get_the_title(get_option('page_for_posts', true));
    } else {
      _e('Latest Posts', 'roots');
    }
  } elseif (is_archive()) {
    $term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy'));
    if ($term) {
      echo $term->name;
    } elseif (is_post_type_archive()) {
      echo get_queried_object()->labels->name;
    } elseif (is_day()) {
      printf(__('Daily Archives: %s', 'roots'), get_the_date());
    } elseif (is_month()) {
      printf(__('Monthly Archives: %s', 'roots'), get_the_date('F Y'));
    } elseif (is_year()) {
      printf(__('Yearly Archives: %s', 'roots'), get_the_date('Y'));
    } elseif (is_author()) {
      $author = get_queried_object();
      printf(__('Author Archives: %s', 'roots'), $author->display_name);
    } else {
      single_cat_title();
    }
  } elseif (is_search()) {
    printf(__('Search Results for %s', 'roots'), get_search_query());
  } elseif (is_404()) {
    _e('Not Found', 'roots');
  } else {
    the_title();
  }
}
 5
Author: Sy Holloway,
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-02-27 13:06:08

Solo necesitamos usar la variable global "post".

global $post;
echo $post->post_title;

Esto se hará eco del título actual de la página/post.

Espero que esta ayuda!!!!

 5
Author: Rahul Balakrishna,
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-05-22 13:22:09

    $title = get_the_title($post); 
    $parent_title = get_the_title($post->post_parent);

    echo $title;
    echo $parent_title;

Espero que esto ayude !! ;)

 4
Author: Jerad Rutnam,
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-10-27 18:40:25

Dentro del bucle

<pre>
if ( have_posts() ) : while ( have_posts() ) : the_post();
/******************************************/
echo get_the_title();
/******************************************/
endwhile; endif;
</pre>

Esto le mostrará el título de la página actual. Para refrence http://codex.wordpress.org/Function_Reference/get_the_title

 2
Author: Umair Hamid,
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
2013-12-19 08:03:41

Sé que esto es viejo, pero me encontré con esto y lo que parece ser más fácil es usar esto.

<?php single_post_title(); ?>
 2
Author: Bowenac,
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-01-29 22:47:43

Una opción, si está buscando la página consultada real, en lugar del ID de página o slug, es interceptar la consulta:

add_action('parse_request', 'show_query', 10, 1);

Dentro de su función, tiene acceso al objeto wp wp y puede obtener el nombre de la página o el nombre del mensaje con:

function show_query($wp){
     if ( ! is_admin() ){ // heck we don't need the admin pages
         echo $wp->query_vars['pagename'];
         echo $wp->query_vars['name'];
     }
}

Si, por otro lado, realmente necesitas los datos del post, el primer lugar para obtenerlos (y posiblemente en este contexto, el mejor) es:

add_action('wp', 'show_page_name', 10, 1);

function show_page_name($wp){
     if ( ! is_admin() ){
        global $post;
        echo $post->ID, " : ", $post->post_name;
     }
}

Finalmente, me doy cuenta de que esto probablemente no era la pregunta de la OP, pero si buscando el nombre de la página Admin, utilice el $pagenow global.

 1
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
2013-07-26 14:20:35

Aquí está mi versión:

$title =ucwords(str_replace('-', ' ', get_query_var('pagename')));

Get_query_var('pagename') me estaba dando el slug de página. Por lo tanto, lo anterior reemplaza todos los guiones, y hace que la primera letra de cada palabra sea mayúscula, por lo que en realidad se puede usar como título.

 1
Author: gray,
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-02-07 16:18:46

Mostrar el título antes de que comience el bucle:

$page_title = $wp_query->post->post_title;

Gracias

 1
Author: Ajay Malhotra,
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-05-24 05:54:29

He encontrado ahora en Wordpress Codec esta función:

obtener consulta http://codex.wordpress.org/Function_Reference/wp_list_pages

Que es una envoltura para $wp_query->get_queried_object. Este post me puso en la dirección correcta, pero parece que necesita esta actualización.

 0
Author: Sandra,
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-10-21 20:06:18

Esto también funciona si está en las funciones.php. No es el mejor enfoque, ya que tiene que utilizar la matriz global, pero funciona.

1 - Primero, necesitamos agregar un filtro. Debe existir un filtro mejor para usar que template_include, pero no los conozco a todos. Por favor, señálame la correcta.

add_filter( 'template_include', 'var_template_include', 1000 );
function var_template_include( $template ){
    global $wp_query;
    $GLOBALS['current_page'] = $wp_query->get_queried_object()->post_name;
    return $template;
}

2-Evite usar la variable directamente

function get_current_page( $echo =  false ) {
    if( !isset( $GLOBALS['current_page'] ) )
        return false;
    return $GLOBALS['current_page'];
}

3 - Ahora puede usar la función get_current_page() en cualquier otra parte de las funciones.php.

 0
Author: toto_tico,
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
2013-06-21 06:53:22