¿Es posible obtener un enlace de página desde su slug?


113

¿Es posible obtener el enlace permanente de una página solo con la babosa? Soy consciente de que puede obtener el enlace permanente de la página desde la ID usando get_page_link():

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

Tengo curiosidad por saber si hay alguna manera de hacer lo mismo con la babosa de una página, como esta:

<a href="<?php echo get_page_link('map'); ?>">Map</a>

Respuestas:


183

Estás hablando de Pages, ¿verdad? No publicaciones.

¿Es esto lo que buscas?

  1. get_permalink( get_page_by_path( 'map' ) )
  2. get_permalink( get_page_by_title( 'Map' ) )
  3. home_url( '/map/' )

44
Quiso decir get_permalink(get_page_by_path('contact')->ID));?
Sampson

1
hmmm no? ¿Qué pasa con la identificación?
zeo

3
get_page_by_path()devuelve una matriz de toda la información de la página. get_permalink()toma una ID de página como primer argumento. Pensé que tendría que pasar explícitamente el valor de ID.
Sampson

10
@ Jonathan: no siempre está documentado, pero muchas funciones de WP aceptan tanto ID numéricos como objetos de publicación completos como argumento.
Jan Fabry

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

9

Creo que esto podría ser mejor:

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 "original" get_page_by_titlede wordpress . (línea 3173)

rgds


11
¿Por qué sería eso mejor? ¿Puedes explicar?
julien_c

Último comentario - Creo que sql necesita tener 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; }

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

@webcitron Creo que solo porque está siguiendo el patrón original de Wordpress que se publica por 'título', solo cambia por 'babosa'. (consulte el enlace )
Matheus Eduardo

Esta es una buena respuesta. Esto evita la posibilidad de que un complemento no autorizado enmascare su página o la filtre incorrectamente. Si devuelve la identificación de la tabla de publicación, puede crear una instancia de \WP_Postella, y eso se resuelve directamente en todas las funciones de WordPress que verifican otros valores. \WP_Posttambién proporciona métodos directamente para encontrar la mayoría de los datos relacionados con la publicación.
mopsyd

6

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

/**
 * Returns the permalink for a page based on the incoming slug.
 *
 * @param   string  $slug   The slug of the page to which we're going to link.
 * @return  string          The permalink of the page
 * @since   1.0
 */
function wpse_4999_get_permalink_by_slug( $slug, $post_type = '' ) {

    // Initialize the permalink value
    $permalink = null;

    // Build the arguments for WP_Query
    $args = array(
        'name'          => $slug,
        'max_num_posts' => 1
    );

    // If the optional argument is set, add it to the arguments array
    if( '' != $post_type ) {
        $args = array_merge( $args, array( 'post_type' => $post_type ) );
    }

    // Run the query (and reset it)
    $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 publicación personalizados y tipos de publicación incorporados (como posty page).


2

la respuesta aceptada es incorrecta porque las páginas jerárquicas no funcionan así. En pocas palabras, la babosa no siempre es la ruta de la página o publicación. Por ejemplo, su página tiene un hijo, etc., la ruta será parent-slug/child-slugy get_page_by_pathno se encontrará de child-slugesta manera. La solución adecuada 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('map'); ?>">Map</a>

1

Prueba esto:

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

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


2
Por favor, editar su respuesta , y añadir una explicación: ¿por qué podría eso resolver el problema?
fuxia

0
    function theme_get_permalink_by_title( $title ) {

    // Initialize the permalink value
    $permalink = null;

    // Try to get the page by the incoming title
    $page = get_page_by_title( strtolower( $title ) );

    // If the page exists, then let's get its permalink
    if( null != $page ) {
        $permalink = get_permalink( $page->ID );
    } // end if

    return $permalink;

} // end theme_get_permalink_by_title

Use esta función por

if( null == theme_get_permalink_by_title( 'Register For This Site' ) ) {
  // The permalink doesn't exist, so handle this however you best see fit.
} else {
  // The page exists, so do what you need to do.
} // end if/else