Respuestas:
Use la variable global $post
:
<?php
global $post;
$post_slug = $post->post_name;
?>
echo
. Entonces, esto sería ideal:<?php global $post; echo $post->post_name; ?>
$WP_Post
?
Según otras respuestas, la babosa se almacena en la post_name
propiedad. 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() );
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.
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_name
propiedad de la propiedad. Esto se puede usar en cualquier lugar de su plantilla.
$post
puede 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_posts
que 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;
query_posts
no es malo cuando se desea alterar la consulta principal , que sin embargo por lo general no lo hace y con frecuencia se emplea mal :)
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.
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) );
}
}
Esta es la función que se debe usar cuando se desea recuperar la babosa fuera del bucle.
get_post_field( 'post_name');
La respuesta se encuentra aquí: ¿Cómo recuperar la babosa de la página actual en WordPress?
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' );
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_loaded
o init
ganchos.
@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
, mysqli
o una PDO
instancia. 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.
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.
Llamada de página dinámica en WordPress.
<?php
get_template_part('foldername/'.basename(get_permalink()),'name');
?>
<?php global $post; $post_slug=$post->post_name; echo $post_slug; ?>