Este posibil să obții link-ul unei pagini din slug-ul său?

7 dec. 2010, 19:09:07
Vizualizări: 219K
Voturi: 150

Este posibil să obții permalink-ul unei pagini doar din slug? Știu că poți obține permalink-ul paginii din ID folosind get_page_link():

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

Sunt curios dacă există vreo modalitate de a face același lucru cu slug-ul unei pagini - în acest fel:

<a href="<?php echo get_page_link('map'); ?>">Hartă</a>
2
Comentarii

De asemenea, poți folosi: site_url('page-slug')

user123456789 user123456789
13 ian. 2021 09:19:51

Rețineți că multe dintre răspunsuri confundă slug-ul unui articol (coloana post_name din tabelul wp_posts din baza de date) cu titlul articolului, care sunt lucruri diferite. De asemenea, este diferit de calea articolului (mai ales vizibil când se utilizează căi ierarhice sau când două articole de tipuri diferite au același slug).

Flimm Flimm
14 iul. 2022 14:41:11
Toate răspunsurile la întrebare 7
11
238

Este acesta ceea ce cauți:

  • get_permalink( get_page_by_path( 'map' ) )
  • get_permalink( get_page_by_title( 'Map' ) )
  • home_url( '/map/' )

Referințe:

7 dec. 2010 20:19:31
Comentarii

Ai vrut să spui get_permalink(get_page_by_path('contact')->ID));?

Sampson Sampson
8 dec. 2010 00:22:09

hmmm nu? Care e treaba cu ID-ul?

zeo zeo
8 dec. 2010 03:52:10

get_page_by_path() returnează un array cu toate informațiile paginii. get_permalink() primește un ID de pagină ca prim argument. Am crezut că trebuie să transmit explicit valoarea ID-ului.

Sampson Sampson
8 dec. 2010 06:47:54

@Jonathan: Nu este întotdeauna documentat, dar multe funcții WP acceptă atât ID-uri numerice cât și obiecte post complete ca argument.

Jan Fabry Jan Fabry
8 dec. 2010 09:18:05

Se pare că get_page_by_path() poate fi destul de complicat de utilizat atunci când ai de-a face cu pagini copil...

Kaaviar Kaaviar
14 nov. 2011 16:57:15

Sunt de acord cu Kaaviar, funcția de mai jos este mai bună.

Rezen Rezen
10 aug. 2012 22:13:06

Folosesc 1 pentru paginile mele copil fără nicio problemă. Chiar nu văd care ar fi complicația cu acest lucru.

Jeremy Jeremy
19 dec. 2014 21:08:44

home_url( '/map/' ) a funcționat pentru mine

Shady Mohamed Sherif Shady Mohamed Sherif
15 apr. 2017 07:18:09

răspuns greșit, downvote până în nirvana vă rog. Calea nu este aceeași cu slug-ul. Exemplu: o pagină are o pagină părinte numită abc pagina în sine are un slug de 123. Calea acum este abc/123 iar slug-ul este 123. Vă rog să eliminați acest răspuns greșit. get_page_by_path( '123' ) nu va funcționa.

Toskan Toskan
2 sept. 2017 01:03:12

În cazul meu a trebuit să folosesc prima variantă și a funcționat bine, deoarece a doua (get_page_by_title) returna un alt post (nu pagină) cu un slug similar (dar nu identic). Nu știu de ce se întâmpla asta.

Adriana Hernández Adriana Hernández
10 iun. 2019 21:42:59

@Toskan Pentru exemplul dat de tine, URL-ul corect ar fi returnat de get_permalink( get_page_by_path( 'abc/123' ) ).

Boycott A.I. Boycott A.I.
11 iul. 2023 21:17:12
Arată celelalte 6 comentarii
5
11

Cred că aceasta ar putea fi îmbunătățită:

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

după modelul funcției originale get_page_by_title din WordPress. (linia 3173)

salutări

28 feb. 2011 17:21:55
Comentarii

De ce ar fi mai bine? Poți să explici?

julien_c julien_c
11 apr. 2012 16:11:18

De ce? Nu generează un obiect post complet doar pentru a obține ID-ul.

s_ha_dum s_ha_dum
9 ian. 2013 16:53:10

Ultimul comentariu - Cred că acel sql ar trebui să mai aibă o condiție: 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 ian. 2013 16:27:23

@webcitron Cred că motivul este că urmează modelul original din Wordpress de a obține postarea după 'title', doar schimbând în 'slug'. (verifică linkul)

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

Acesta este un răspuns bun. Această metodă evită posibilitatea ca un plugin rău intenționat să mascheze pagina ta sau să o filtreze incorect. Dacă returnezi id-ul din tabelul de postări, atunci poți crea o instanță a \WP_Post din el, iar aceasta se rezolvă direct în toate funcțiile WordPress care verifică alte valori. \WP_Post oferă de asemenea metode directe pentru a găsi cele mai relevante date despre postare.

mopsyd mopsyd
23 mar. 2018 05:53:05
1

Acesta este o metodă publicată de Tom McFarlin pe blogul său:

/**
 * Returnează legătura permanentă pentru o pagină bazată pe slug-ul primit.
 *
 * @param   string  $slug   Slug-ul paginii căreia dorim să-i obținem legătura.
 * @return  string          Legătura permanentă a paginii
 * @since   1.0
 */
function wpse_4999_get_permalink_by_slug( $slug, $post_type = '' ) {

    // Inițializăm valoarea legăturii permanente
    $permalink = null;

    // Construim argumentele pentru WP_Query
    $args = array(
        'name'          => $slug,
        'max_num_posts' => 1
    );

    // Dacă argumentul opțional este setat, îl adăugăm în array-ul de argumente
    if( '' != $post_type ) {
        $args = array_merge( $args, array( 'post_type' => $post_type ) );
    }

    // Executăm interogarea (și o resetăm)
    $query = new WP_Query( $args );
    if( $query->have_posts() ) {
        $query->the_post();
        $permalink = get_permalink( get_the_ID() );
        wp_reset_postdata();
    }
    return $permalink;
}

Funcționează atât cu tipuri de postări personalizate, cât și cu cele integrate (cum ar fi post și page).

31 ian. 2013 23:19:43
Comentarii

În Wordpress 6.4.2, a trebuit să folosesc post_name în loc de name în interogarea $args

Scribblemacher Scribblemacher
12 ian. 2024 19:56:06
0

răspunsul acceptat este greșit deoarece paginile ierarhice nu funcționează în acest fel. Mai simplu spus, slug-ul nu este întotdeauna calea către pagina sau articolul. De exemplu, dacă pagina ta are un copil, etc., calea va fi parent-slug/child-slug și get_page_by_path nu va reuși să găsească child-slug în acest mod. Soluția corectă este următoarea:

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'); ?>">Hartă</a>
2 sept. 2017 01:10:53
2

Încearcă asta:

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

get_page_by_path( 'path' ) returnează un obiect pagină/postare care poate fi apoi folosit de get_page_link(), deoarece această funcție acceptă un obiect pagină/postare și returnează legătura permanentă.

26 feb. 2018 13:54:08
Comentarii

Te rog să [editezi] răspunsul tău și să adaugi o explicație: de ce ar putea rezolva problema?

fuxia fuxia
26 feb. 2018 15:27:02

Reține că calea nu este neapărat aceeași cu slug-ul.

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

    // Inițializează valoarea permalinkului
    $permalink = null;

    // Încearcă să obții pagina după titlul primit
    $page = get_page_by_title( strtolower( $title ) );

    // Dacă pagina există, atunci obține permalinkul ei
    if( null != $page ) {
        $permalink = get_permalink( $page->ID );
    } // end if

    return $permalink;

} // end theme_get_permalink_by_title

Folosește această funcție astfel:

if( null == theme_get_permalink_by_title( 'Înregistrează-te pe acest site' ) ) {
  // Permalinkul nu există, deci gestionează situația în modul considerat potrivit.
} else {
  // Pagina există, deci poți efectua operațiunile necesare.
} // end if/else
11 nov. 2014 06:49:51
Comentarii

Titlul nu este același cu slug-ul.

Flimm Flimm
14 iul. 2022 14:39:50
1
-1

Un pic mai târziu, dar cam așa...

Puteți face asta:
<?php $map = get_page_by_title( 'hartă' ); ?>
<a href="<?php echo get_page_link('$map->ID'); ?>">Hartă</a>

Așa fac eu :-)

Mulțumesc,
Josh

1 ian. 2021 16:59:52
Comentarii

Titlul nu este același cu slug-ul.

Flimm Flimm
14 iul. 2022 14:39:35