Conforme outras respostas, slug é armazenado na post_namepropriedade Embora possa ser acessado diretamente, prefiro a get_post_field()função (subutilizada) para acessar as propriedades da postagem que não possuem API adequada para elas.
Requer postagem fornecida explicitamente e não é padrão para a atual, portanto, na íntegra, para a postagem atual, seria:
O método mais confiável até a data que eu pude apresentar é 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 sempre.
RESPOSTA ORIGINAL
Outra alternativa mais segura para esse problema é usar o get_queried_object()que mantém o objeto consultado atual para obter o slug de página mantido pela post_namepropriedade. Isso pode ser usado em qualquer lugar do seu modelo.
$postpode ser usado, mas pode não ser confiável, pois qualquer consulta ou código personalizado pode alterar o valor de $post, portanto, deve ser evitado fora do loop.
Usar get_queried_object()para obter o objeto de página atual é muito mais confiável e tem menor probabilidade de ser modificado, a menos que você esteja usando o mal query_postsque interrompe o objeto de consulta principal, mas isso depende de você.
Devo dizer que query_postsnão é mau quando você quiser alterar a consulta principal , que, contudo, você geralmente não fazer e muitas vezes é mal utilizado :)
isso depende das configurações do link permanente. Se você usar a configuração "simples", os links serão parecidos http://domain/?p=123, deixando você com ?p=123.
quer
8
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 com mais confiabilidade do que usar a publicação slug.
Pode ser uma pergunta antiga, mas 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));}}
Se você deseja uma resposta mais detalhada, pode usar a seguinte consulta SQL para buscar todas as postagens que são postagens, páginas ou taxonomias personalizadas a qualquer momento, mesmo que nenhum gancho tenha sido acionado até o momento.
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 mesmo na primeira linha do seu arquivo de funções, mesmo antes dos ganchos mu_plugins_loadedou init.
@Nota
Isso pressupõe que você tenha um prefixo de banco de dados padrão wp_posts. Se você precisar dar conta de prefixos variáveis, poderá obter a tabela de postagem correta através do PHP facilmente, fazendo o seguinte:
<?phpglobal $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 qualquer um $wpdb, mysqliou uma PDOinstância. Como não há entrada do usuário nesta consulta, é seguro executar sem uma instrução preparada, desde que você não injete nenhuma variável nela.
Sugiro que você armazene isso como um valor estático privado de uma classe, para que possa ser acessado sem ter que disparar a consulta novamente mais de uma vez por página para obter o melhor desempenho, algo como isto:
classPost_Cache{privatestatic $post_cache;publicfunction __construct(){//This way it skips the operation if it's already set.
$this->initCache();}publicfunctionget($id, $type =null){if(!(is_int( $id )&& array_key_exists( $id,self::$post_cache )))returnfalse;}if(!is_null( $type )){//returns the specific column value for the idreturnself::$post_cache[$id][$type];}//returns the whole rowreturnself::$post_cache[$id];}privatefunction 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ê entende a essência. Se precisar de mais detalhes, você pode buscá-los normalmente, comnew \WP_Post( get_the_ID() );
Isso permitirá que você verifique as postagens a qualquer momento, mesmo que o loop do wordpress não atinja um ponto em que sua solicitação seja agradável. Esta é uma versão um pouco mais otimizada da mesma consulta executada pelo próprio núcleo do Wordpress. Esse filtro filtra todo o lixo que você não gostaria que fosse devolvido e fornece apenas uma lista bem organizada com o ID do autor, tipo de postagem, slug e visibilidade relevantes. Se precisar de mais detalhes, você pode buscá-los normalmente new \WP_Post($id);, ou usar qualquer uma das outras funções nativas do Wordpress com qualquer uma das linhas relevantes da tabela, mesmo fora do loop.
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 podem ser substituídos, como a maioria das coisas no Wordpress.
<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
echo
. Então, isso seria ideal:<?php global $post; echo $post->post_name; ?>
$WP_Post
?Conforme outras respostas, slug é armazenado na
post_name
propriedade Embora possa ser acessado diretamente, prefiro aget_post_field()
função (subutilizada) para acessar as propriedades da postagem que não possuem API adequada para elas.Requer postagem fornecida explicitamente e não é padrão para a atual, portanto, na íntegra, para a postagem atual, seria:
fonte
get_post_field
sem segundo argumento ( docs )EDIT 5 DE ABRIL DE 2016
Depois de procurar mais confiabilidade, acabei respondendo à seguinte postagem que leva a esta edição: ( Não deixe de conferir )
O método mais confiável até a data que eu pude apresentar é o seguinte:
Dessa forma, você tem 99,9999% de certeza de obter os dados corretos sempre.
RESPOSTA ORIGINAL
Outra alternativa mais segura para esse problema é usar o
get_queried_object()
que mantém o objeto consultado atual para obter o slug de página mantido pelapost_name
propriedade. Isso pode ser usado em qualquer lugar do seu modelo.$post
pode ser usado, mas pode não ser confiável, pois qualquer consulta ou código personalizado pode alterar o valor de$post
, portanto, deve ser evitado fora do loop.Usar
get_queried_object()
para obter o objeto de página atual é muito mais confiável e tem menor probabilidade de ser modificado, a menos que você esteja usando o malquery_posts
que interrompe o objeto de consulta principal, mas isso depende de você.Você pode usar o acima descrito a seguir
fonte
query_posts
não é mau quando você quiser alterar a consulta principal , que, contudo, você geralmente não fazer e muitas vezes é mal utilizado :)A maneira simples de obter a lesma é com:
fonte
http://domain/?p=123
, deixando você com?p=123
.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 com mais confiabilidade do que usar a publicação slug.
fonte
Pode ser uma pergunta antiga, mas criei as funções get_the_slug () e the_slug () com base nas suas respostas.
fonte
Esta é a função a ser usada quando se deseja recuperar a lesma fora do loop.
Resposta encontrada aqui: Como recuperar a lesma da página atual no WordPress?
fonte
Mais adiante, na resposta de Matthew Boynes, se você estiver interessado em obter a lesma dos pais (se houver), também achei esta função útil:
Por exemplo, para adicionar a lesma à classe do corpo:
fonte
Se você deseja uma resposta mais detalhada, pode usar a seguinte consulta SQL para buscar todas as postagens que são postagens, páginas ou taxonomias personalizadas a qualquer momento, mesmo que nenhum gancho tenha sido acionado até o momento.
SQL bruto:
Isso funciona mesmo na primeira linha do seu arquivo de funções, mesmo antes dos ganchos
mu_plugins_loaded
ouinit
.@Nota
Isso pressupõe que você tenha um prefixo de banco de dados padrão
wp_posts
. Se você precisar dar conta de prefixos variáveis, poderá obter a tabela de postagem correta através do PHP facilmente, fazendo o seguinte:Em seguida, execute com qualquer um
$wpdb
,mysqli
ou umaPDO
instância. Como não há entrada do usuário nesta consulta, é seguro executar sem uma instrução preparada, desde que você não injete nenhuma variável nela.Sugiro que você armazene isso como um valor estático privado de uma classe, para que possa ser acessado sem ter que disparar a consulta novamente mais de uma vez por página para obter o melhor desempenho, algo como isto:
Uso
Você entende a essência. Se precisar de mais detalhes, você pode buscá-los normalmente, 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 atinja um ponto em que sua solicitação seja agradável. Esta é uma versão um pouco mais otimizada da mesma consulta executada pelo próprio núcleo do Wordpress. Esse filtro filtra todo o lixo que você não gostaria que fosse devolvido e fornece apenas uma lista bem organizada com o ID do autor, tipo de postagem, slug e visibilidade relevantes. Se precisar de mais detalhes, você pode buscá-los normalmente
new \WP_Post($id);
, ou usar qualquer uma das outras funções nativas do Wordpress com qualquer uma das linhas relevantes da tabela, mesmo fora do loop.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 podem ser substituídos, como a maioria das coisas no Wordpress.
fonte
Sinceramente, não entendo por que nenhuma das respostas simplesmente faz:
Isso funciona para todas as postagens, páginas, rotas personalizadas.
fonte
Chamada de página dinâmica no WordPress.
fonte