Como posso obter o nome da página atual no WordPress?

162

Qual código PHP pode ser usado para recuperar o nome da página atual em um tema WordPress?

Todas as soluções que eu vi até agora ( the_title(), get_page()->post_name, get_post(), etc.) não funcionam para uma página que contém entradas de correio. Todos retornarão o nome da última entrada do blog.

Em outras palavras, suponha que você tenha uma página criada no WordPress com o nome "Minhas Notícias". Esta página está definida como a "página de postagem". Adicione algumas postagens à página. Agora, qual API pode ser usada para recuperar a sequência "my-news" em vez do nome da última postagem?


Eu encontrei a seguinte variável que parece funcionar.

$wp_query->queried_object->post_name

Esta é realmente a versão amigável para URL do nome da página (slug), que era o que eu estava procurando também. Isso foi testado com o modelo padrão ( vinte e dez ). Eu realmente não sei por que as duas variáveis ​​fornecidas abaixo não funcionam no meu site. Obrigado ao keatch pela print_r()dica .

Agora, por que essa informação está escondida tão profundamente?

Bernard
fonte
para o Nome use: single_post_title ('', false); para o slug use: get_query_var ('pagename');
Jtmielczarek #

Respostas:

182

A variável global do WordPress $pagenamedeve estar disponível para você. Eu apenas tentei com a mesma configuração que você especificou.

$pagenameé definido no arquivo wp-includes / theme.php, dentro da função get_page_template(), que é chamada naturalmente antes que os arquivos de tema da página sejam analisados, para que esteja disponível em qualquer ponto dos modelos para páginas.

  • Embora pareça não estar documentado, o $pagenamevar é definido apenas se você usar permalinks. Eu acho que isso ocorre porque, se você não usá-los, o WordPress não precisa da lesma de página, por isso não a configura.

  • $pagename não está definido se você usar a página como uma página inicial estática.

    • Este é o código dentro de /wp-includes/theme.php, que usa a solução que você apontou quando $pagenamenão pode ser definida:

      $ pagename = get_query_var ('pagename'); if (! $ pagename && $ id> 0) {// Se uma página estática for definida como primeira página, $ pagename não será definido. Recupere-o do objeto consultado $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }

AJJ
fonte
4
$ pagename está vazio quando usado dentro do header.php. Eu tentei usar o modelo padrão (twentyten) e usá-lo imediatamente após a tag <body>, mas ele não está definido. Aliás, nenhuma das variáveis ​​query_vars parece estar definida nesse estágio.
Bernard
1
Não vejo nenhum motivo para a ausência dessa variável; talvez eu tenha entendido mal sua configuração? Entendi que você está tentando fazer isso dentro de um modelo de página. Mesmo se você escrever "echo $ pagename" na primeira linha do header.php, ele deverá fornecer o valor. Com qual versão do WP você está lidando?
AJJ 30/01
1
Você pode tentar uma abordagem um pouco diferente usando get_query_var ('pagename').
AJJ
@AJweb: Sim, é para um modelo que estou construindo, mas estou usando o modelo padrão para testes, dentro do header.php. Tenho a impressão de que você não testou sua solução. Você vê o nome da página quando coloca um <h1> <? Php echo $ pagename?> </h1> logo após a tag <body> no header.php?
Bernard
1
Isso fez o truque para mim: $pagename = $wp_query->queried_object->post_name;apenas não esqueça de definir global $wp_query;antes!
Saran
38

Minha abordagem para obter o nome do slug da página:

$slug = basename(get_permalink());
goksel
fonte
Isso funciona apenas se eles usam URLs bonitos, não é?
Betty
24

Ok, você deve pegar o título da página antes do loop.

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

Verifique a referência: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

Faça um

print_r($wp_query)

antes do loop para ver todos os valores do $wp_queryobjeto.

keatch
fonte
1
Isso também não funciona. Se eu imprimir o objeto $ wp_query logo após a tag <body>, vejo que o primeiro objeto de postagem é a entrada do blog, não a própria página. No entanto, obrigado pela dica print_r (). Eu poderia descobrir a variável que tem as informações que estou procurando (colocando essas informações na pergunta).
Bernard
ecoando que $ page_title var funcionou para mim no cabeçalho, obrigado.
Claire
22
<?php wp_title(''); ?>

Isso funcionou para mim.

Se bem entendi, você deseja obter o nome da página em uma página que possui entradas de postagem.

GregB
fonte
10

Você pode obter a página atual, postagem ou tipo de postagem personalizado com a variável global $post:

echo $post->post_title

Nota: Em uma função ou classe, você precisará especificar global $post;antes de tentar usar $post.

Se você tiver loops em sua página, termine cada loop com wp_reset_postdata();para $postvoltar ao item padrão que está sendo exibido (a página).

Observe que a variável 'post_title' também está disponível para qualquer loop / consulta personalizada ... incluindo itens de menu e anexos de mídia ... tudo no WordPress é uma 'publicação'.

James
fonte
Essa resposta é de 2012. Existe algum conhecimento sobre se esse método ainda funcionará com o WP mais recente?
Martin
1
Sim - o manuseio principal do WP de tipos de postagem não mudou
James
8

Se você deseja acessar a página atual de dentro do seu arquivo functions.php (então, antes do loop, antes de $postser preenchido, antes de $wp_queryser inicializado, etc ...), você realmente não tem escolha a não ser acessar as próprias variáveis ​​do servidor e extrair a página solicitada da string de consulta.

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

Observe que esta é uma solução "burra". Não sabe, por exemplo, que a página com a lesma 'em breve' também é p=6. E assume que suas configurações de permalink estão definidas como pagename(que deveriam ser de qualquer maneira!).

Ainda assim, pode ser um pequeno truque útil se você tiver um cenário controlado. Estou usando isso em uma situação em que desejo redirecionar visitantes não logados para uma página "em breve"; mas tenho que ter certeza de que não estou jogando-os no temido "loop de redirecionamento"; portanto, preciso excluir a página "em breve" desta regra:

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
fonte
7

Acredito que o tema inicial do Roots tem uma função fantástica para obter o título da página atual. É muito hacker, cobre todas as bases e pode ser facilmente usado com o 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
fonte
5

Tente o seguinte:

$pagename = get_query_var('pagename');
Mohammad Sabbagh
fonte
Uma explicação estaria em ordem (responda editando sua resposta , não aqui nos comentários).
Peter Mortensen
5

Eu vim com uma solução mais simples.

Obtenha o valor retornado do nome da página em wp_title (). Se estiver vazio, imprima o nome da página inicial, caso contrário, ecoe o valor wp_title ().

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

Lembre-se de remover a separação com o primeiro argumento e defina display como false para usar como uma entrada para a variável. Em seguida, basta colocar o código entre o cabeçalho, etc.

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

Isso funcionou para mim e, garantindo que o primeiro seja declarado na seção em que você deseja extrair $title, isso pode ser ajustado para retornar variáveis ​​diferentes.

Tech1337
fonte
5

Nós só precisamos usar a variável global "post":

global $post;
echo $post->post_title;

Isso ecoará o título da página / postagem atual.

Rahul Balakrishna
fonte
E o HTML GET ?
Peter Mortensen
4

Usar:

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

echo $title;
echo $parent_title;
Jerad Rutnam
fonte
Uma explicação estaria em ordem.
Peter Mortensen
3

Parece ser o mais fácil de usar:

<?php single_post_title(); ?>
Bowenac
fonte
1
Essa chamada retorna o último nome da postagem, não o nome da página que contém as postagens, pelo menos é o que entendo no documento on-line sem testá-lo.
Bernard
Era exatamente isso que eu estava procurando. Criei um novo cabeçalho para minha página e isso puxou o nome da página conforme o esperado. Obrigado!
AJ Hernandez
3

Mostre o título antes do início do loop:

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

Uma opção, se você estiver procurando pela página consultada real, em vez do ID da página ou slug, é interceptar a consulta:

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

Na sua função, você tem acesso ao objeto $ wp e pode obter o nome da página ou o nome da postagem com:

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'];
     }
}

Se, por outro lado, você realmente precisa dos dados da postagem, o primeiro local para obtê-los (e sem dúvida nesse contexto, o melhor) é:

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

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

Por fim, percebo que essa provavelmente não foi a pergunta do OP, mas se você estiver procurando o nome da página Admin , use o global $pagenow.

Tom Auger
fonte
2

Dentro do loop do WordPress :

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

Isso mostrará o título da página atual.

Para referência: get_the_title ()

Umair Hamid
fonte
1

Aqui está a minha versão:

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

get_query_var ('pagename') estava apenas me dando a página lesma. Portanto, o texto acima substitui todos os traços e coloca a primeira letra de cada palavra em maiúscula - para que possa realmente ser usada como título.

cinzento
fonte
0

Foi isso que acabei usando a partir de 2018:

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

Agora encontrei essa função no WordPress Codec ,

ser consultado

que é um invólucro para $wp_query->get_queried_object.

Este post me colocou na direção certa, mas parece que precisa dessa atualização.

Sandra
fonte
0

Isso também funciona se você estiver no functions.php. Não é a melhor abordagem, pois você precisa usar a matriz global, mas funciona.

  1. Primeiro, precisamos adicionar um filtro. Deve haver um filtro melhor para usar do que o template_include, mas eu não conheço todos eles. Por favor, aponte-me para o caminho certo.

    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 a variável diretamente

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. Agora você pode usar a função get_current_page()em qualquer outra parte do functions.php.

toto_tico
fonte