Como recuperar o slug da página atual?

80

Estou tentando recuperar o slug da página atual do wordpress fora do loop. O título da página retorna com wp_title () , mas como posso obter o slug?

<li><a href="/slug-of-current-page/"><?php wp_title("",true); ?></a></li>
    
por sarytash 13.02.2012 / 05:25
fonte

10 respostas

133

use a variável global $post .

<?php 
    global $post;
    $post_slug=$post->post_name;
?>
    
por Arvind Pal 13.02.2012 / 07:27
fonte
61

Como outras respostas, o slug é armazenado na propriedade post_name . Embora possa ser acessado diretamente, eu prefiro a função (% usada) get_post_field() para as propriedades de postagem de acesso que não possuem uma API adequada para elas.

Ela exige que a postagem seja fornecida de maneira explícita e não padrão para a atual, portanto, na íntegra para a postagem atual, ela seria:

$slug = get_post_field( 'post_name', get_post() );
    
por Rarst 20.05.2015 / 23:10
fonte
25

EDITAR 5 DE ABRIL DE 2016

Depois de cavar para obter mais confiabilidade, acabei fazendo esta resposta no seguinte post, o que leva a essa edição : ( Não deixe de conferir )

O método mais confiável até a data que eu poderia chegar é o seguinte:

// Get the queried object and sanitize it
$current_page = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() );
// Get the page slug
$slug = $current_page->post_name;

Dessa forma, você tem 99,9999% de certeza de obter os dados corretos todas as vezes.

RESPOSTA ORIGINAL

Outra alternativa mais segura para esse problema é usar get_queried_object() , que mantém o objeto atual consultado para obter o slug de página que é mantido pela propriedade post_name . Isso pode ser usado em qualquer lugar no seu modelo.

$post pode ser usado, mas pode não ser confiável, pois qualquer consulta personalizada ou código personalizado pode alterar o valor de $post , portanto, isso deve ser evitado fora do loop.

Usar get_queried_object() para obter o objeto de página atual é muito mais confiável e é menos provável que seja modificado, a menos que você esteja usando o mal query_posts que quebra o objeto de consulta principal, mas isso depende de você.

Você pode usar o acima como segue

if ( is_page() )
    $slug = get_queried_object()->post_name;
    
por Pieter Goosen 21.05.2015 / 09:00
fonte
9

A maneira mais simples de obter o slug é com:

<?php echo basename(get_permalink()); ?>
    
por tracey 25.09.2015 / 01:26
fonte
7

Dado o exemplo de código, parece que você realmente precisa de um link. Nesse caso, você pode usar get_permalink () , que pode ser usado fora do loop. Isso deve fazer o que você precisa de maneira mais confiável do que usar o slug de postagem.

    
por Matthew Boynes 13.02.2012 / 05:55
fonte
2

Pode ser uma pergunta antiga, mas eu criei as funções get_the_slug () e the_slug () com base nas suas respostas.

if ( !function_exists("get_the_slug") ) {
    /**
    * Returns the page or post slug.
    *
    * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
    * @return string
    */
    function get_the_slug( $id = null ){
        $post = get_post($id);
        if( !empty($post) ) return $post->post_name;
        return ''; // No global $post var or matching ID available.
    }
    /**
    * Display the page or post slug
    *
    * Uses get_the_slug() and applies 'the_slug' filter.
    *
    * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post.
    */
    function the_slug( $id=null ){
        echo apply_filters( 'the_slug', get_the_slug($id) );
    }
}
    
por Earlee 29.08.2017 / 11:09
fonte
0

Mais adiante na resposta do @Matthew Boynes, se você estiver interessado em obter o slug pai (se houver algum), também achei essa função útil:

function mytheme_get_slugs() {
    if ( $link = get_permalink() ) {
        $link = str_replace( home_url( '/' ), '', $link );
        if ( ( $len = strlen( $link ) ) > 0 && $link[$len - 1] == '/' ) {
            $link = substr( $link, 0, -1 );
        }
        return explode( '/', $link );
    }
    return false;
}

Por exemplo, para adicionar o (s) slug (s) à classe body:

function mytheme_body_class( $classes ) {
    if ( $slugs = mytheme_get_slugs() ) {
        $classes = array_merge( $classes, $slugs );
    }
    return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );
    
por bonger 12.02.2015 / 17:33
fonte
0

Se você quiser uma resposta mais direta, poderá usar a seguinte consulta SQL para buscar todas as postagens, páginas ou taxonomias personalizadas a qualquer momento, mesmo que nenhum gancho tenha sido disparado como de ainda.

SQL bruto:

SELECT 'id', 'post_type' AS 'type', 'post_author' AS 'author', 'post_name' AS 
'slug', 'post_status' AS 'status'
FROM wp_posts 
WHERE 'post_type' NOT IN ('attachment', 'nav_menu_item', 'revision')
AND 'post_status' NOT IN ('draft', 'trash')
ORDER BY 'id';

Isso funciona até mesmo na primeira linha do arquivo de funções, mesmo antes dos ganchos mu_plugins_loaded ou init .

@note

Isto pressupõe que você tenha um prefixo de banco de dados padrão wp_posts . Se você precisar considerar os prefixos de variáveis, poderá obter a tabela de postagens correta por meio do PHP facilmente, fazendo o seguinte:

<?php
global $wpdb;
$table = $wpdb->posts;
$query = "SELECT 'id', 'post_type' AS 'type', 'post_author' AS 'author', 'post_name' AS 
'slug', 'post_status' AS 'status'
FROM " . $table . "
WHERE 'post_type' NOT IN ('attachment', 'nav_menu_item', 'revision')
AND 'post_status' NOT IN ('draft', 'trash')
ORDER BY 'id';"

Em seguida, execute com $wpdb , mysqli ou PDO instance. Como não há entrada do usuário nesta consulta, é seguro executar sem uma instrução preparada, desde que você não injete variáveis nela.

Eu sugiro armazenar isso como um valor estático privado de uma classe, para que ele possa ser acessado sem precisar disparar a consulta novamente mais de uma vez por página para melhor desempenho, algo assim:

class Post_Cache
{
    private static $post_cache;

    public function __construct()
    {
        //This way it skips the operation if it's already set.
        $this->initCache();
    }

    public function get($id, $type = null)
    {
        if ( !(is_int( $id ) && array_key_exists( $id, self::$post_cache ) ) )
            return false;
        }
        if ( !is_null( $type ) )
        {
            //returns the specific column value for the id
            return self::$post_cache[$id][$type];
        }
        //returns the whole row
        return self::$post_cache[$id];
    }

    private function initCache()
    {
        if ( is_null(self::$post_cache) )
        {

            $query = "...";
            $result = some_query_method($query); //Do your query logic here.
            self::$post_cache = $result;
        {
    }
}

Uso

$cache = new \Post_Cache();

//Get the page slug
$slug = $cache->get( get_the_ID(), 'slug');

if ($cache->get( get_the_ID() ))
{
    //post exists
} else {
    //nope, 404 'em
}
if ( $cache->get( get_the_ID(), 'status') === 'publish' )
{
    //it's public
} else {
    //either check current_user_can('whatever_permission') or just 404 it,
    //depending whether you want it visible to the current user or not.
}
if ( $cache->get( get_the_ID(), 'type') === 'post' )
{
    //It's a post
}
if ( $cache->get( get_the_ID(), 'type') === 'page' )
{
    //It's a page
}

Você obtém a essência. Se você precisar de mais detalhes, você pode buscá-los como por normal com new \WP_Post( get_the_ID() );

Isso permitirá que você verifique as postagens a qualquer momento, mesmo que o loop do wordpress não tenha atingido um ponto em que ele considere sua solicitação aceitável. Esta é uma versão ligeiramente mais otimizada da mesma consulta executada pelo próprio núcleo do Wordpress. Esse filtro filtra todo o lixo que você não deseja que seja devolvido e apenas fornece uma lista bem organizada com o ID do autor, tipo de postagem, slug e visibilidade relevantes. Se você precisar de mais detalhes, você pode buscá-los como por normal com new \WP_Post($id); , ou usar qualquer uma das outras funções nativas do Wordpress com qualquer uma das linhas da tabela relevantes, mesmo fora do loop.

Eu uso uma configuração semelhante em alguns dos meus próprios temas e plugins personalizados, e funciona muito bem. Também é seguro e não deixa dados internos flutuando no escopo global, onde pode ser substituído como a maioria das coisas no Wordpress.

    
por mopsyd 23.03.2018 / 02:43
fonte
0

Esta é a função a ser usada quando se deseja recuperar o slug fora do loop.

get_post_field( 'post_name');

Resposta encontrada aqui: Como Recuperar o Slug da Página Atual no WordPress?

    
por Kash 24.11.2018 / 17:03
fonte
-1

Chamadas de páginas dinâmicas no WordPress.

<?php
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
    
por Sujoy Bhowmick 14.02.2017 / 05:05
fonte

Tags