¿Cómo recupero la babosa de la página actual?

99

Estoy tratando de recuperar la babosa de la página actual de WordPress fuera del bucle. El título de la página regresa con wp_title (), pero ¿cómo puedo obtener la babosa?

<li>
  <a href="/slug-of-current-page/">
    <?php wp_title('', true); ?>
  </a>
</li>
sarytash
fuente

Respuestas:

151

Use la variable global $post:

<?php 
    global $post;
    $post_slug = $post->post_name;
?>
Arvind Pal
fuente
3
Gracias. Tu solución funciona muy bien. Solo necesito hacer eco de la babosa:<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>
sarytash
1
Como dijo sarytash, lo necesitas echo. Entonces, esto sería ideal:<?php global $post; echo $post->post_name; ?>
its_me
¿Qué hay de $WP_Post?
Peter Mortensen
68

Según otras respuestas, la babosa se almacena en la post_namepropiedad. A pesar de que podría accederse directamente, prefiero el (infrautilizada) get_post_field()función para acceder a las propiedades de correos que no tienen ninguna API adecuada para ellos.

Requiere que la publicación se proporcione explícitamente y no es predeterminada para la actual, por lo que en su totalidad para la publicación actual sería:

$slug = get_post_field( 'post_name', get_post() );
Rarst
fuente
12
Vale la pena señalar que si está en el bucle puede usarlo get_post_fieldsin un segundo argumento ( docs )
jmarceli
26

EDITAR 5 DE ABRIL DE 2016

Después de cavar para obtener más confiabilidad, terminé haciendo esta respuesta a la siguiente publicación que conduce a esta edición: ( Asegúrese de verificarlo )

El método hasta la fecha más confiable que se me ocurrió es el siguiente:

// 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;

De esta manera, está 99.9999% seguro de que obtendrá los datos correctos cada vez.

RESPUESTA ORIGINAL

Otra alternativa más segura a este problema es usar el get_queried_object()que contiene el objeto consultado actual para obtener la ficha de la post_namepropiedad de la propiedad. Esto se puede usar en cualquier lugar de su plantilla.

$postpuede usarse, pero puede no ser confiable ya que cualquier consulta personalizada o código personalizado puede cambiar el valor de $post, por lo que debe evitarse fuera del ciclo.

Usar get_queried_object()para obtener el objeto de la página actual es mucho más confiable y es menos probable que se modifique, a menos que esté usando el mal query_postsque rompe el objeto de consulta principal, pero eso depende de usted.

Puede usar lo anterior de la siguiente manera

if ( is_page() )
    $slug = get_queried_object()->post_name;
Pieter Goosen
fuente
Debo decir que query_postsno es malo cuando se desea alterar la consulta principal , que sin embargo por lo general no lo hace y con frecuencia se emplea mal :)
jave.web
11

La forma simple de obtener la babosa es con:

<?php echo basename(get_permalink()); ?>
traza
fuente
2
esto depende de la configuración del enlace permanente. Si utiliza la configuración "simple", los enlaces se verán http://domain/?p=123, dejándolo con ?p=123.
Mene
8

Dado el ejemplo de código, parece que lo que realmente necesita es un enlace. En ese caso, puede usar get_permalink () , que se puede usar fuera del bucle. Eso debería hacer lo que necesita de manera más confiable que usar el post slug.

Matthew Boynes
fuente
44
Sin embargo, esta es la URL completa, no solo la babosa.
Fred
2

Puede ser una pregunta antigua, pero creé las funciones get_the_slug () y the_slug () en función de sus respuestas.

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) );
    }
}
Earlee
fuente
0

Un poco más adelante en la respuesta de @Matthew Boynes, si está interesado en obtener la babosa principal (si la hay) también he encontrado útil esta función:

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 ejemplo, para agregar las babosas a la clase de cuerpo:

function mytheme_body_class( $classes ) {
    if ( $slugs = mytheme_get_slugs() ) {
        $classes = array_merge( $classes, $slugs );
    }
    return $classes;
}
add_filter( 'body_class', 'mytheme_body_class' );
bonger
fuente
0

Si desea una respuesta más discreta, puede usar la siguiente consulta SQL para obtener todas las publicaciones que sean publicaciones, páginas o taxonomías personalizadas en cualquier momento, incluso si todavía no se han disparado ganchos.

SQL sin formato:


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`;

Esto funciona incluso en la primera línea de su archivo de funciones, incluso antes de los mu_plugins_loadedo initganchos.

@Nota

Esto supone que tiene un prefijo de base de datos estándar wp_posts. Si necesita tener en cuenta los prefijos variables, puede obtener la tabla de publicación correcta a través de PHP con bastante facilidad haciendo lo siguiente:

<?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`;"

A continuación, ejecute con cualquiera $wpdb, mysqlio una PDOinstancia. Dado que no hay entrada de usuario en esta consulta, es seguro ejecutarla sin una declaración preparada siempre que no le inyecte ninguna variable.

Sugeriría almacenar esto como un valor estático privado de una clase, para que se pueda acceder sin tener que activar la consulta nuevamente más de una vez por página para obtener el mejor rendimiento, algo como esto:

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
}

Entiendes la esencia. Si necesita más detalles, puede obtenerlos de la forma habitual connew \WP_Post( get_the_ID() );


Esto le permitirá revisar las publicaciones en cualquier momento, incluso si el ciclo de WordPress no ha llegado a un punto en el que su solicitud sea aceptable. Esta es una versión un poco más optimizada de la misma consulta ejecutada por el núcleo de Wordpress. Este filtra toda la basura que no desea que se devuelva, y solo le brinda una lista bien organizada con la identificación de autor relevante, el tipo de publicación, el slug y la visibilidad. Si necesita más detalles, puede buscarlos de la forma habitual con new \WP_Post($id);, o usar cualquiera de las otras funciones nativas de Wordpress con cualquiera de las filas de la tabla relevantes, incluso fuera del bucle.

Utilizo una configuración similar en algunos de mis propios temas y complementos personalizados, y funciona bastante bien. También es seguro y no deja datos internos flotando en el ámbito global donde se puede anular como lo hace la mayoría de las cosas en Wordpress.

mopsyd
fuente
0

Sinceramente, no entiendo por qué ninguna de las respuestas simplemente lo hace:

global $wp;
$current_slug = $wp->request;

// Given the URL of https://example.com/foo-bar
if ($current_slug === 'foo-bar') {
  // the condition will match.
}

Esto funciona para todas las publicaciones, páginas, rutas personalizadas.

leymannx
fuente
-1

Llamada de página dinámica en WordPress.

<?php
    get_template_part('foldername/'.basename(get_permalink()),'name');
    ?>
Sujoy Bhowmick
fuente