Este posibil să obții link-ul unei pagini din slug-ul său?
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>

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:

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.

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

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

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

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.

Î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.

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

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

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

@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)

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.

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
).

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>

Î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ă.

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
