¿Es posible obtener el enlace de una página a partir de su slug?

7 dic 2010, 19:09:07
Vistas: 219K
Votos: 150

¿Es posible obtener el enlace permanente de una página usando solamente el slug? Sé que se puede obtener el enlace permanente de la página usando el ID con get_page_link():

<a href="<?php echo get_page_link(40); ?>">Mapa</a>

Me pregunto si hay alguna manera de hacer lo mismo con el slug de una página - algo así:

<a href="<?php echo get_page_link('mapa'); ?>">Mapa</a>
2
Comentarios

También puedes usar: site_url('slug-de-la-página')

user123456789 user123456789
13 ene 2021 09:19:51

Ten en cuenta que muchas de las respuestas confunden el slug de una entrada (la columna post_name en la tabla de base de datos wp_posts) con el título de la entrada, que son diferentes. También es diferente de la ruta de una entrada (especialmente notable cuando se usan rutas jerárquicas o cuando dos entradas de diferentes tipos comparten el mismo slug).

Flimm Flimm
14 jul 2022 14:41:11
Todas las respuestas a la pregunta 7
11
238

¿Es esto lo que estás buscando:

  • get_permalink( get_page_by_path( 'mapa' ) )
  • get_permalink( get_page_by_title( 'Mapa' ) )
  • home_url( '/mapa/' )

Referencias:

7 dic 2010 20:19:31
Comentarios

¿Quisiste decir get_permalink(get_page_by_path('contact')->ID));?

Sampson Sampson
8 dic 2010 00:22:09

hmmm ¿no? ¿Qué pasa con el ID?

zeo zeo
8 dic 2010 03:52:10

get_page_by_path() devuelve un array con toda la información de la página. get_permalink() toma un ID de página como primer argumento. Pensé que tendría que pasar explícitamente el valor del ID.

Sampson Sampson
8 dic 2010 06:47:54

@Jonathan: No siempre está documentado, pero muchas funciones de WP aceptan tanto ID numéricos como objetos de post completos como argumento.

Jan Fabry Jan Fabry
8 dic 2010 09:18:05

Parece que get_page_by_path() puede ser bastante complicado de usar cuando se trata de páginas hijas...

Kaaviar Kaaviar
14 nov 2011 16:57:15

De acuerdo con Kaaviar, la función de abajo es mejor.

Rezen Rezen
10 ago 2012 22:13:06

Yo uso 1 para mis páginas hijas sin problemas. Realmente no veo la complicación con ello.

Jeremy Jeremy
19 dic 2014 21:08:44

home_url( '/mapa/' ) funcionó para mí

Shady Mohamed Sherif Shady Mohamed Sherif
15 abr 2017 07:18:09

respuesta incorrecta, downvote al nirvana por favor. La ruta no es lo mismo que el slug. Ejemplo: una página tiene una página padre llamada abc la página en sí tiene un slug de 123. La ruta ahora es abc/123 el slug es 123. Por favor elimina esta respuesta incorrecta. get_page_by_path( '123' ) no funcionará.

Toskan Toskan
2 sept 2017 01:03:12

En mi caso tuve que usar el primero y funcionó bien, porque el segundo (get_page_by_title) estaba devolviendo otro enlace de publicación (no página) con un slug similar (pero no el mismo). No sé por qué estaba sucediendo esto.

Adriana Hernández Adriana Hernández
10 jun 2019 21:42:59

@Toskan Para el ejemplo que diste, la URL correcta sería devuelta por get_permalink( get_page_by_path( 'abc/123' ) ).

Boycott A.I. Boycott A.I.
11 jul 2023 21:17:12
Mostrar los 6 comentarios restantes
5
11

Creo que esto podría mejorarse:

function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) {
    global $wpdb;
    $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s", $page_slug, $post_type ) );
    if ( $page )
            return get_page($page, $output);
    return null;
}

siguiendo el patrón de la función original get_page_by_title de WordPress. (línea 3173)

Saludos

28 feb 2011 17:21:55
Comentarios

¿Por qué sería mejor? ¿Puedes explicarlo?

julien_c julien_c
11 abr 2012 16:11:18

¿Por qué? No genera un objeto de publicación completo solo para obtener el ID.

s_ha_dum s_ha_dum
9 ene 2013 16:53:10

Último comentario - creo que ese SQL necesita una condición más: function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) { global $wpdb; $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = 'publish'", $page_slug, $post_type ) ); if ( $page ) return get_page($page, $output); return null; }

User User
9 ene 2013 16:27:23

@webcitron Creo que simplemente porque sigue el patrón original de WordPress de obtener posts por 'título', solo cambiándolo por 'slug'. (ver el enlace)

Matheus Eduardo Matheus Eduardo
13 may 2013 14:08:55

Esta es una buena respuesta. Esto evita la posibilidad de que un plugin malintencionado ocupe tu página o la filtre incorrectamente. Si devuelves el id de la tabla de posts, entonces puedes crear una instancia de \WP_Post a partir de ella, y eso se resuelve directamente en todas las funciones de WordPress que verifican otros valores. \WP_Post también proporciona métodos directamente para encontrar la mayoría de los datos relacionados sobre el post.

mopsyd mopsyd
23 mar 2018 05:53:05
1

Este es un método publicado por Tom McFarlin en su blog:

/**
 * Devuelve el enlace permanente (permalink) para una página basado en el slug proporcionado.
 *
 * @param   string  $slug   El slug de la página a la que vamos a enlazar.
 * @param   string  $post_type  Tipo de entrada opcional (post, page o CPT).
 * @return  string          El enlace permanente de la página
 * @since   1.0
 */
function wpse_4999_get_permalink_by_slug( $slug, $post_type = '' ) {

    // Inicializamos el valor del permalink
    $permalink = null;

    // Construimos los argumentos para WP_Query
    $args = array(
        'name'          => $slug,
        'max_num_posts' => 1
    );

    // Si se proporciona el argumento opcional, lo añadimos al array de argumentos
    if( '' != $post_type ) {
        $args = array_merge( $args, array( 'post_type' => $post_type ) );
    }

    // Ejecutamos la consulta (y la reseteamos después)
    $query = new WP_Query( $args );
    if( $query->have_posts() ) {
        $query->the_post();
        $permalink = get_permalink( get_the_ID() );
        wp_reset_postdata();
    }
    return $permalink;
}

Funciona con tipos de entrada personalizados (CPT) y tipos nativos de WordPress (como post y page).

31 ene 2013 23:19:43
Comentarios

En Wordpress 6.4.2, necesité usar post_name en lugar de name en la consulta $args

Scribblemacher Scribblemacher
12 ene 2024 19:56:06
0

la respuesta aceptada es incorrecta porque las páginas jerárquicas no funcionan de esa manera. En pocas palabras, el slug no siempre es la ruta de la página o entrada. Por ejemplo, si tu página tiene una página hija, la ruta será slug-padre/slug-hijo y get_page_by_path fallará al intentar encontrar slug-hijo de esta manera. La solución correcta es esta:

function mycoolprefix_post_by_slug($the_slug, $post_type = "page"){
 $args = array(
   'name'        => $the_slug,
   'post_type'   => $post_type,
   'post_status' => 'publish',
   'numberposts' => 1
 );
 $my_page = get_posts($args)[0];
 return $my_page;
}

<a href="<?php echo mycoolprefix_post_by_slug('mapa'); ?>">Mapa</a>
2 sept 2017 01:10:53
2

Prueba esto:

<a href="<?php echo get_page_link( get_page_by_path( 'mapa' ) ); ?>">Mapa</a>

get_page_by_path( 'ruta' ) devuelve un objeto de página/publicación que luego puede ser utilizado por get_page_link() ya que acepta un objeto de página/publicación y devuelve el enlace permanente.

26 feb 2018 13:54:08
Comentarios

Por favor [edita] tu respuesta y agrega una explicación: ¿por qué eso podría resolver el problema?

fuxia fuxia
26 feb 2018 15:27:02

Ten en cuenta que la ruta no es necesariamente lo mismo que el slug.

Flimm Flimm
14 jul 2022 14:39:04
1
-1
    function theme_get_permalink_by_title( $title ) {

    // Inicializar el valor del enlace permanente
    $permalink = null;

    // Intentar obtener la página por el título proporcionado
    $page = get_page_by_title( strtolower( $title ) );

    // Si la página existe, obtener su enlace permanente
    if( null != $page ) {
        $permalink = get_permalink( $page->ID );
    } // end if

    return $permalink;

} // end theme_get_permalink_by_title

Usa esta función con

if( null == theme_get_permalink_by_title( 'Registrarse en este sitio' ) ) {
  // El enlace permanente no existe, así que maneja esto como mejor consideres.
} else {
  // La página existe, así que haz lo que necesites hacer.
} // end if/else
11 nov 2014 06:49:51
Comentarios

El título no es el mismo que el slug.

Flimm Flimm
14 jul 2022 14:39:50
1
-1

Un poco tarde, pero algo así...

Puedes hacer esto:
<?php $map = get_page_by_title( 'map' ); ?>
<a href="<?php echo get_page_link('$map->ID'); ?>">Mapa</a>

Así es como lo hago yo :-)

Gracias,
Josh

1 ene 2021 16:59:52
Comentarios

El título no es el mismo que el slug.

Flimm Flimm
14 jul 2022 14:39:35