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

162

¿Qué código PHP se puede usar 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 funcionan para una página que contiene entradas de correos. Todos devolverán el nombre de la última entrada del blog.

Dicho de otra manera, suponga que tiene una página creada en WordPress con el nombre "My News". Esta página está configurada como la "página de publicación". Agrega un par de publicaciones a la página. Ahora, ¿qué API se puede usar para recuperar la cadena "my-news" en lugar del nombre de la última publicación?


He encontrado la siguiente variable que parece funcionar.

$wp_query->queried_object->post_name

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

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

Bernardo
fuente
para el Nombre use: single_post_title ('', false); para el uso de babosa: get_query_var ('pagename');
jtmielczarek

Respuestas:

182

La variable global de WordPress $pagenamedebería estar disponible para usted. Acabo de probar con la misma configuración que especificó.

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

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

  • $pagename no se establece si usa 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ñaló cuando $pagenameno se puede configurar:

      $ pagename = get_query_var ('pagename'); if (! $ pagename && $ id> 0) {// Si una página estática se establece como la página principal, $ pagename no se establecerá. Recuperarlo del objeto consultado $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }

AJJ
fuente
44
$ pagename está vacío cuando se usa dentro de header.php. Intenté usar la plantilla predeterminada (veinte) y usarla inmediatamente después de la etiqueta <body> pero no está configurada. Por cierto, ninguna de las variables query_vars parece estar establecida en esa etapa.
Bernard
1
No veo ninguna razón para la ausencia de esa variable, ¿tal vez he entendido mal su configuración? Comprendí que estás tratando de hacer esto dentro de una plantilla de página. Incluso si escribe "echo $ pagename" en la primera línea de header.php, debería darle el valor. ¿Con qué versión de WP estás lidiando?
AJJ
1
Podría intentar un enfoque ligeramente diferente usando get_query_var ('nombre de página').
AJJ
@AJweb: Sí, es para una plantilla que estoy construyendo pero estoy usando la plantilla predeterminada para las pruebas, dentro de header.php. Tengo la impresión de que no has probado tu solución. ¿Ves el nombre de la página cuando pones un <h1> <? Php echo $ pagename?> </h1> justo después de la etiqueta <body> en header.php?
Bernard
1
Esto hizo el truco para mí: $pagename = $wp_query->queried_object->post_name;, simplemente no se olvide de establecer global $wp_query;antes!
Saran
38

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

$slug = basename(get_permalink());
goksel
fuente
Esto funciona solo si usan una URL bonita, ¿no?
Betty
24

Ok, debes tomar el título de la página antes del bucle.

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

Verifique 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 del $wp_queryobjeto.

keatch
fuente
1
Esto tampoco funciona. Si imprimo el objeto $ wp_query justo después de la etiqueta <body>, veo que el primer objeto de publicación es la entrada del blog, no la página en sí. Sin embargo, gracias por la sugerencia print_r (). Podría encontrar la variable que tiene la información que estoy buscando (poniendo esta información en la pregunta).
Bernard
haciendo eco de que $ page_title var funcionó para mí en el encabezado, gracias.
Claire
22
<?php wp_title(''); ?>

Esto funcionó para mí.

Si entiendo correctamente, desea obtener el nombre de la página en una página que tiene entradas de publicación.

GregB
fuente
10

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

echo $post->post_title

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

Si tiene bucles en su página, asegúrese de finalizar cada bucle wp_reset_postdata();para $postvolver al 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 ... incluidos elementos de menú y archivos adjuntos de medios ... todo en WordPress es una 'publicación'.

James
fuente
Esta respuesta es de 2012, ¿hay algún conocimiento sobre si este método seguirá funcionando con WP más reciente?
Martin
1
Sí se WP-manejo de tipos de puesto básico de no ha cambiado
James
8

Si está buscando acceder a la página actual desde su archivo functions.php (por lo tanto, antes del ciclo, antes de que $postse complete, antes de que $wp_queryse inicialice, 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 la babosa 'próximamente' también lo es p=6. Y supone que su configuración de enlace permanente está establecida en pagename(¡lo que debería ser de todos modos!).

Aún así, puede ser un pequeño truco útil si tienes un escenario controlado. Estoy usando esto en una situación en la que deseo redirigir a los visitantes que no han iniciado sesión a una página "próximamente"; pero tengo que asegurarme de que no los estoy arrojando al temido "bucle de redireccionamiento", así 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' );
}
Tom Auger
fuente
7

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

/**
 * 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();
  }
}
Sy Holloway
fuente
5

Prueba esto:

$pagename = get_query_var('pagename');
Mohammad Sabbagh
fuente
Una explicación estaría en orden (responda editando su respuesta , no aquí en los comentarios).
Peter Mortensen
5

Se me ocurrió 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, repita el valor de wp_title ().

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

Recuerde eliminar la separación con el primer argumento y luego establecer la visualización en falso para usarlo como entrada a la variable. Luego simplemente coloque el código entre su encabezado, etc.etiquetas.

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

Funcionó de maravilla para mí y asegurándose de que el primero se declare en la sección donde desea extraer el $title, esto se puede ajustar para devolver diferentes variables.

Tech1337
fuente
5

Solo necesitamos usar la variable global "post":

global $post;
echo $post->post_title;

Esto hará eco del título de la página / publicación actual.

Rahul Balakrishna
fuente
¿Qué pasa con HTML GET ?
Peter Mortensen
4

Utilizar:

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

echo $title;
echo $parent_title;
Jerad Rutnam
fuente
Una explicación estaría en orden.
Peter Mortensen
3

Este parece ser el más fácil de usar:

<?php single_post_title(); ?>
Bowenac
fuente
1
Esta llamada devuelve el último nombre de la publicación, no el nombre de la página que contiene las publicaciones, al menos eso es lo que entiendo del documento en línea sin probarlo.
Bernard
Esto es exactamente lo que estaba buscando. Hice un nuevo encabezado para mi página y esto sacó el nombre de la página como se esperaba. ¡Gracias!
AJ Hernández
3

Muestra el título antes de que comience el ciclo:

$page_title = $wp_query->post->post_title;
Ajay Malhotra
fuente
2

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

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

Dentro de su función, tiene acceso al objeto $ wp y puede obtener el nombre de la página o el nombre de la publicación 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 necesita los datos de la publicación, 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 probablemente esta no era la pregunta del OP, pero si está buscando el nombre de la página de administración , use el global $pagenow.

Tom Auger
fuente
2

Dentro del bucle de WordPress :

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

Esto le mostrará el título de la página actual.

Para referencia: get_the_title ()

Umair Hamid
fuente
1

Aquí está mi versión:

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

get_query_var ('pagename') solo me estaba dando la babosa de la página. Entonces, 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.

gris
fuente
0

Esto es lo que terminé usando, a partir de 2018:

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">
Conceder
fuente
0

Ahora he encontrado esta función en WordPress Codec ,

ser consultado

que es un envoltorio para $wp_query->get_queried_object .

Esta publicación me puso en la dirección correcta, pero parece que necesita esta actualización.

Sandra
fuente
0

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

  1. Primero, necesitamos agregar un filtro. Debe existir un mejor filtro para usar que template_include, pero no los conozco todos. Por favor, apúntame a 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 functions.php.

toto_tico
fuente