Verificar si existe el Slug de una Página y mostrar su Título
Me encontré con esta función para verificar si existe una página por su slug y funciona muy bien
function the_slug_exists($post_name) {
global $wpdb;
if($wpdb->get_row("SELECT post_name FROM wp_posts WHERE post_name = '" . $post_name . "'", 'ARRAY_A')) {
return true;
} else {
return false;
}
}
pero lo que necesito hacer ahora es verificar si existe y luego mostrar el título de esa página, cualquier ayuda es apreciada.
así que cuando pongo este código en la página para buscar el slug:
<?php if (the_slug_exists('nombre-pagina')) {
echo '$post_title';
} ?>
todo está perfecto excepto que necesito que la función muestre también el título además de buscar el slug, espero que eso tenga más sentido.

Al observar la consulta MySQL en la función, queda claro que aunque coincide con el post_name y devuelve verdadero o falso. Lo que deseas encontrar es si una página existe por su slug. Por lo tanto, en ese caso, la función que has elegido es incorrecta.
Para obtener la página por título puedes simplemente usar:
$page = get_page_by_title( 'Página de ejemplo' );
echo $page->title
En caso de que quieras obtener la página por slug, puedes usar el siguiente código:
function get_page_title_for_slug($page_slug) {
$page = get_page_by_path( $page_slug , OBJECT );
if ( isset($page) )
return $page->post_title;
else
return "Coincidencia no encontrada";
}
Puedes llamar a la función anterior de la siguiente manera:
echo "<h1>" . get_page_title_for_slug("pagina-ejemplo") . "</h1>";
Házme saber si eso ayuda.

En general, las funciones con prefijo the_
muestran su salida directamente y las funciones con prefijo get_
devuelven el valor

¿Cómo llamaría a esta función en una página para verificar si ese slug existe y luego mostrar el título de la página que acabo de buscar?

Gracias Pieter. He realizado los cambios necesarios. @JohnCarlos - He agregado la llamada a la función al final de mi respuesta.

Lo que esta y otras respuestas no mencionan es que la función get_page_by_path
literalmente hace lo que dice. Si le proporcionas el slug de una página que tiene un padre, ¡no funcionará!. En ese caso necesitas pasarle parent_slug/page_slug
. Pero todos asumen que no hay páginas padre.

Casi nunca se recomienda ejecutar SQL personalizado cuando WordPress tiene funciones nativas para realizar un trabajo específico. El slug o post_name
de una página también se utiliza en la ruta (URL) de la página para identificar y devolver el contenido de esa página cuando se visita. Esto significa que podemos usar get_page_by_path()
y simplemente pasar el slug (post_name) a la función para obtener el objeto de la página devuelto.
get_page_by_path (
string $page_path,
string $output = OBJECT,
string|array $post_type = 'page'
)
Como muchas otras funciones y convenciones de nomenclatura (como post_name
, que en realidad es el slug y no el nombre) en WordPress, el nombre de get_page_by_path()
es confuso y, en mi opinión, poco acertado, ya que puedes pasar cualquier tipo de publicación a la función.
Podemos usar get_page_by_path()
, que no devolverá nada si la página no se encuentra, o devolverá el objeto de la página en caso de éxito. Escribamos una función envoltorio adecuada que devuelva false en caso de fallo y siempre devuelva el objeto de la página, independientemente de si existe.
function get_post_by_post_name( $slug = '', $post_type = '' )
{
// Asegurarnos de que tenemos valores establecidos para $slug y $post_type
if ( !$slug
|| !$post_type
)
return false;
// No sanitizaremos la entrada, ya que get_page_by_path() se encargará de eso
$post_object = get_page_by_path( $slug, OBJECT, $post_type );
if ( !$post_object )
return false;
return $post_object;
}
Luego puedes usarla de la siguiente manera:
if ( function_exists( 'get_post_by_post_name' ) ) {
$post_object = get_post_by_post_name( 'post-name-better-known-as-slug', 'your_desired_post_type' );
// Mostrar solo si tenemos una publicación válida
if ( $post_object ) {
echo apply_filters( 'the_title', $post_object->post_title );
}
}
Si realmente solo necesitas que se devuelva el título de la publicación, podemos modificar ligeramente la función:
function get_post_title_by_post_name( $slug = '', $post_type = '' )
{
// Asegurarnos de que tenemos valores establecidos para $slug y $post_type
if ( !$slug
|| !$post_type
)
return false;
// No sanitizaremos la entrada, ya que get_page_by_path() se encargará de eso
$post_object = get_page_by_path( $slug, OBJECT, $post_type );
if ( !$post_object )
return false;
return apply_filters( 'the_title', $post_object->post_title );
}
y luego usarla así:
if ( function_exists( 'get_post_title_by_post_name' ) ) {
$post_title = get_post_title_by_post_name( 'post-name-better-known-as-slug', 'your_desired_post_type' );
// Mostrar solo si tenemos una publicación válida
if ( $post_title ) {
echo $post_title;
}
}

Aquí tienes una actualización del mismo código para ti
function the_slug_exists($post_name) {
global $wpdb;
// Sanitizar el título
$post_name = sanitize_title($post_name);
if($wpdb->get_row("SELECT post_name FROM wp_posts WHERE post_name = '" . $post_name . "'", 'ARRAY_A')) {
return $post_name;
} else {
return false;
}
Luego puedes ejecutarlo simplemente llamándolo con la función echo como en el siguiente código, que solo imprimirá el nombre de la publicación si existe.
echo the_slug_exists($post_name);
ACTUALIZACIÓN
Alternativamente puedes confiar en la función condicional por defecto de WordPress is_page() por lo que tu código se simplifica de la siguiente manera...
if( is_page($post_name) ):
echo $post_name;
endif;

En general, las funciones con prefijo the_
imprimen su salida directamente y las funciones con prefijo get_
retornan el valor
