È possibile ottenere un link alla sua lumaca?


113

È possibile ottenere il permalink di una pagina solo dalla lumaca? Sono consapevole che puoi ottenere il permalink della pagina dall'ID utilizzando get_page_link():

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

Sono curioso di sapere se esiste un modo per fare lo stesso con la lumaca di una pagina - in questo modo:

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

Risposte:


183

Stai parlando di Pages, giusto? Non messaggi.

È questo quello che stai cercando:

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

4
Volevi dire get_permalink(get_page_by_path('contact')->ID));?
Sampson,

1
hmmm no? Che cos'è l'ID?
zeo,

3
get_page_by_path()restituisce una matrice di tutte le informazioni sulla pagina. get_permalink()accetta un ID pagina come primo argomento. Ho pensato che avrei dovuto passare esplicitamente il valore ID.
Sampson,

10
@Jonathan: non è sempre documentato, ma molte funzioni WP accettano sia l'ID numerico sia gli oggetti post completi come argomento.
Jan Fabry,

1
Sembra che get_page_by_path () possa essere abbastanza complicato da usare quando si ha a che fare con pagine figlio ...
Kaaviar

9

Penso che questo potrebbe essere migliore:

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

seguendo il modello di "originale" get_page_by_titledi wordpress . (linea 3173)

rgds


11
Perché sarebbe meglio? Puoi spiegare?
julien_c,

Ultimo commento - Penso che sql debba avere un'altra condizione: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; }

Perché? Non genera un oggetto post completo solo per ottenere l'ID.
s_ha_dum,

@webcitron Penso solo perché segue il modello originale di Wordpress che viene pubblicato per "titolo", cambiando solo per "lumaca". (controlla il link )
Matheus Eduardo,

Questa è una buona risposta Ciò aggira la possibilità di un plugin canaglia che maschera la tua pagina o la filtra in modo errato. Se si restituisce l'id dalla tabella di post, è possibile creare un'istanza \WP_Postda esso e che si risolve direttamente in tutte le funzioni di wordpress che verificano altri valori. \WP_Postfornisce anche metodi direttamente per trovare la maggior parte dei dati relativi al post.
mopsyd,

6

Questo è un metodo pubblicato da Tom McFarlin sul suo 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;
}

Funziona con tipi di posta personalizzati e tipi di posta incorporati (come poste page).


2

la risposta accettata è sbagliata perché le pagine gerarchiche non funzionano così. In poche parole, la lumaca non è sempre il percorso della pagina o del post. Ad esempio, la tua pagina ha un figlio, ecc. Il percorso sarà parent-slug/child-sluge get_page_by_pathnon riuscirà a trovare in child-slugquesto modo. La soluzione corretta è questa:

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

Prova questo:

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

get_page_by_path( 'path' )restituisce oggetto page / post che può essere utilizzato da get_page_link()quando accetta l'oggetto post / page e restituisce permalink.


2
Si prega di modificare la risposta , e aggiungere una spiegazione: perché poteva che risolvere il 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

Utilizzare questa funzione con

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.