¿Cómo recuperar el slug de la página actual?

80

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

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

10 respuestas

133

usa la variable global $post .

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

Según otras respuestas, el slug se almacena en la propiedad post_name . Si bien se puede acceder a directamente, prefiero la función (subutilizada) get_post_field() para las propiedades de publicación de acceso que no tienen una API adecuada para ellas.

Requiere que la publicación se proporcione de forma explícita y no es predeterminada a la actual, por lo tanto, para la publicación actual sería:

$slug = get_post_field( 'post_name', get_post() );
    
respondido por el Rarst 20.05.2015 - 23:10
25

EDITAR 5 DE ABRIL DE 2016

Después de buscar más confiabilidad, terminé haciendo esta respuesta en la siguiente publicación que conduce a esta edición. : ( Asegúrate de comprobarlo )

El método más confiable hasta la fecha que podría encontrar 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á seguro al 99.9999% de que obtiene los datos correctos en todo momento.

RESPUESTA ORIGINAL

Otra alternativa más segura a este problema es usar get_queried_object() , que contiene el objeto consultado actual para obtener el slug de página que se encuentra en la propiedad post_name . Esto se puede utilizar en cualquier parte de su plantilla.

Se puede usar

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

El uso de 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 malvado query_posts que rompe el objeto de consulta principal, pero eso depende de usted.

Puede usar lo anterior como sigue

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

La forma más sencilla de obtener el slug es con:

<?php echo basename(get_permalink()); ?>
    
respondido por el tracey 25.09.2015 - 01:26
7

Dado el ejemplo del código, parece que lo que realmente necesitas es un enlace. En ese caso, puede utilizar get_permalink () , que puede usarse fuera del bucle. Eso debería hacer lo que necesita más confiablemente que usar la barra de publicaciones.

    
respondido por el Matthew Boynes 13.02.2012 - 05:55
2

Podría ser una pregunta antigua, pero creé las funciones get_the_slug () y the_slug () en función de tus 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) );
    }
}
    
respondido por el Earlee 29.08.2017 - 11:09
0

Más adelante en la respuesta de @Matthew Boynes, si está interesado en obtener también la babosa principal (si corresponde), esta función me parece ú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 ejemplo, para agregar el / los slug (s) 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' );
    
respondido por el bonger 12.02.2015 - 17:33
0

Si desea una respuesta más sencilla, 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 no se han activado enlaces en absoluto. de todavia.

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 enlaces mu_plugins_loaded o init .

@note

Esto supone que tiene un prefijo de base de datos estándar wp_posts . Si necesita tener en cuenta los prefijos de variables, puede obtener la tabla de publicaciones 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 $wpdb , mysqli o con una instancia PDO . Como no hay ninguna entrada del usuario en esta consulta, es seguro ejecutarla sin una declaración preparada siempre y cuando no le inyectes ninguna variable.

Sugeriría almacenar esto como un valor estático privado de una clase, por lo que se puede acceder sin tener que volver a realizar la consulta 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;
        {
    }
}

Usuario

$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
}

Tienes la esencia. Si necesita más detalles, puede obtenerlos según lo normal con new \WP_Post( get_the_ID() );

Esto le permitirá revisar las publicaciones en cualquier momento, incluso si el bucle de wordpress no ha alcanzado un punto en el que encuentre que su solicitud es aceptable. Esta es una versión ligeramente más optimizada de la misma consulta ejecutada por el núcleo de Wordpress. Este filtra todos los mensajes no deseados que no desea que se devuelvan, y solo le ofrece una lista bien organizada con el id. De autor, el tipo de publicación, el slug y la visibilidad relevantes. Si necesita más detalles, puede obtenerlos según lo normal con new \WP_Post($id); , o usar cualquiera de las otras funciones nativas de Wordpress con cualquiera de las filas relevantes de la tabla, incluso fuera del bucle.

Utilizo una configuración similar en un par 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 pueden ser anulados como la mayoría de las cosas en Wordpress.

    
respondido por el mopsyd 23.03.2018 - 02:43
0

Esta es la función que se usa cuando se desea recuperar la bala fuera del bucle.

get_post_field( 'post_name');

Respuesta encontrada aquí: ¿Cómo recuperar el Slug de la página actual en WordPress?

    
respondido por el Kash 24.11.2018 - 17:03
-1

Llamadas de páginas dinámicas en WordPress.

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

Lea otras preguntas en las etiquetas