Verificar si existe el Slug de una Página y mostrar su Título

17 mar 2016, 03:23:58
Vistas: 25.4K
Votos: 0

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.

1
Comentarios

En general, las funciones con prefijo the_ muestran su salida y las funciones con prefijo get_ retornan

Pieter Goosen Pieter Goosen
17 mar 2016 06:28:00
Todas las respuestas a la pregunta 3
4

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.

17 mar 2016 05:11:52
Comentarios

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

Pieter Goosen Pieter Goosen
17 mar 2016 06:27:54

¿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?

John Carlos John Carlos
17 mar 2016 06:50:05

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

Prasad Nevase Prasad Nevase
17 mar 2016 10:47:08

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.

NextGenThemes NextGenThemes
25 jun 2020 20:27:28
1

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;
    }
}
17 mar 2016 09:46:51
Comentarios

No funciona, tengo una página con un slug pero la función devuelve falso.

NextGenThemes NextGenThemes
25 jun 2020 20:17:52
2

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;
17 mar 2016 04:40:51
Comentarios

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

Pieter Goosen Pieter Goosen
17 mar 2016 06:27:07

esto parece que solo muestra el slug del post 'post_name' cuando necesito mostrar el post_title y el if is_page solo funcionará si estoy realmente en esa página, no como una búsqueda para ver si existe

John Carlos John Carlos
17 mar 2016 06:44:26