Est-il possible d'obtenir un lien de page à partir de son slug?

113

Est-il possible d'obtenir le lien permanent d'une page à partir de la limace seule? Je suis conscient que vous pouvez obtenir le permalien de la page à partir de l'ID en utilisant get_page_link():

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

Je suis curieux de savoir s'il existe un moyen de faire la même chose avec le slug d'une page - comme ceci:

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

Réponses:

183

Vous parlez de Pages non? Pas de messages.

Est-ce ce que vous cherchez:

  1. get_permalink( get_page_by_path( 'map' ) )
  2. get_permalink( get_page_by_title( 'Map' ) )
  3. home_url( '/map/' )
zeo
la source
4
Vouliez-vous dire get_permalink(get_page_by_path('contact')->ID));?
Sampson
1
hmmm non? Qu'est-ce que l'ID?
Zoé
3
get_page_by_path()renvoie un tableau de toutes les informations de page. get_permalink()prend un identifiant de page comme premier argument. Je pensais que je devrais explicitement passer la valeur ID.
Sampson
10
@ Jonathan: Ce n'est pas toujours documenté, mais de nombreuses fonctions de WP acceptent à la fois les ID numériques et les objets de publication complets en tant qu'argument.
Jan Fabry
1
Il semble que get_page_by_path () puisse être assez compliqué à utiliser pour gérer des pages enfant ...
Kaaviar
9

Je pense que cela pourrait être mieux:

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;
}

suivant le modèle "original" get_page_by_titlede wordpress . (ligne 3173)

rgds

Matheus Eduardo
la source
11
Pourquoi cela serait-il mieux? Peux-tu expliquer?
julien_c
Dernier commentaire - Je pense que SQL doit avoir une condition supplémentaire: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; }
Pourquoi? Il ne génère pas d'objet de publication complet uniquement pour obtenir l'ID.
Samedi
@webcitron, je pense que tout simplement parce que suit le modèle original de Wordpress qui reçoit un post par 'titre', changeant simplement pour 'slug'. (consultez le lien )
Matheus Eduardo
C'est une bonne réponse. Cela évite la possibilité d’un plugin malicieux masquant votre page ou le filtrant de manière incorrecte. Si vous renvoyez l'id de la table post, vous pouvez alors créer une instance à \WP_Postpartir de celle-ci, qui résout directement dans toutes les fonctions wordpress qui recherchent d'autres valeurs. \WP_Postfournit également des méthodes directement pour trouver la plupart des données relatives à la publication.
mopsyd
6

C'est une méthode publiée par Tom McFarlin sur son 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;
}

Il fonctionne avec les types de publication personnalisés et les types de publication intégrés (tels que postet page).

karité
la source
2

la réponse acceptée est fausse car les pages hiérarchiques ne fonctionnent pas comme ça. En termes simples, le slug n'est pas toujours le chemin de la page ou de la publication. Par exemple, votre page a un enfant, etc. le chemin sera parent-slug/child-sluget get_page_by_pathne trouvera pas child-slugcette voie. La solution appropriée est la suivante:

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>
Toskan
la source
1

Essaye ça:

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

get_page_by_path( 'path' )retourne l'objet page / post qui peut ensuite être utilisé get_page_link()car il accepte l'objet post / page et renvoie un lien permanent.

Sigma Wadbude
la source
2
Veuillez modifier votre réponse et ajouter une explication: pourquoi cela pourrait-il résoudre le problème?
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

Utilisez cette fonction en

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
utilisateur46487
la source