Cum obții ID-ul unui post de tip personalizat din slug?

3 dec. 2015, 12:00:42
Vizualizări: 87.4K
Voturi: 24

Este posibil să obții ID-ul unui post de tip personalizat doar din slug?

Din câte știu, putem obține ID-ul folosind titlul. Dar pot exista titluri identice într-un tip de postare personalizat, așa că, având în vedere că slug-urile sunt unice, este posibil acest lucru???

0
Toate răspunsurile la întrebare 3
0
67

Puteți folosi get_page_by_path() - nu lăsați numele să vă înșele, al treilea argument este tipul de postare:

if ( $post = get_page_by_path( 'the_slug', OBJECT, 'post_type' ) )
    $id = $post->ID;
else
    $id = 0;
3 dec. 2015 12:51:49
2
13

Dacă dorești doar ID-ul postării, această soluție funcționează într-o singură linie.

url_to_postid( site_url('the_slug') );
4 nov. 2017 00:31:49
Comentarii

Funcția url_to_postid este foarte flexibilă: poți transmite orice fel de permalink/URL complet și vei obține cel mai precis ID de post pentru acel URL. Cu toate acestea, din cauza utilizării flexibile, este destul de lentă (mai ales cu multe endpoint-uri/tipuri de postări). Dacă transmiți doar un slug pentru un anumit tip de postare, este mult mai rapid să folosești get_page_by_path()

Philipp Philipp
3 mar. 2018 01:03:30

Soluție bună pentru când nu ești sigur de tipul de postare.

gregdev gregdev
19 mar. 2022 23:40:52
6

Dacă aștepți câteva zile și faci upgrade la WordPress 4.4, care va fi lansat pe 8 Decembrie (după informațiile mele), poți folosi noul parametru post_name__in în WP_Query care acceptă un array de slug-uri

EXEMPLU

Dacă ai nevoie de obiectul post complet

$args = [
    'post_type'      => 'my_custom_post_type',
    'posts_per_page' => 1,
    'post_name__in'  => ['post-slug']
];
$q = get_posts( $args );
var_dump( $q );

Dacă ai nevoie doar de ID

$args = [
    'post_type'      => 'my_custom_post_type',
    'posts_per_page' => 1,
    'post_name__in'  => ['post-slug'],
    'fields'         => 'ids' 
];
$q = get_posts( $args );
var_dump( $q );
3 dec. 2015 12:59:46
Comentarii

Frumos, dar probabil puțin solicitant pentru a obține un articol după slug? De ce au adăugat această funcționalitate!?

TheDeadMedic TheDeadMedic
3 dec. 2015 14:36:11

@TheDeadMedic Poate fi puțin solicitant, da, nu am testat cu adevărat performanța la acest capitol, am adăugat-o doar ca o alternativă ;-). Cât despre motiv, chiar nu știu, pare una dintre acele funcționalități "drăguțe-de-avut-dar-inutile" pentru care WordPress este atât de renumit. Convenția de denumire, după părerea mea, este și ea greșită, la fel ca proprietatea post_name și parametrul category_name, care ar fi trebuit să fie slug și nu name

Pieter Goosen Pieter Goosen
3 dec. 2015 14:48:02

Frumos :) wow, de fapt pentru mine este o actualizare grozavă :)

stlawrance stlawrance
3 dec. 2015 17:32:58

@TheDeadMedic Nu există nicio diferență de timp între metoda mea și metoda ta. Obțin constant între 0,002 și 0,005 secunde pentru a rula fiecare dintre interogările noastre. De asemenea, ambele metode rulează doar 1 interogare. ;-)

Pieter Goosen Pieter Goosen
3 dec. 2015 19:10:42

Când am sugerat că get_page_by_path este mai performant, mă refeream doar că PHP are mai puțină muncă de făcut (un pic de parsare a argumentelor și o interogare SQL) în comparație cu WP_Query (care implică instanțierea multiplă de obiecte și rularea prin multe filtre/acțiuni/argumente). Timpii reali rareori tind să ilustreze diferența decât dacă simulăm mii de operații. Dar este bine de știut că în lumea reală nu face nicio diferență în final ;)

TheDeadMedic TheDeadMedic
3 dec. 2015 19:23:19

@TheDeadMedic mă refeream doar că PHP are mai puțină muncă de făcut - da, sigur, sunt total de acord. Este întotdeauna bine să cunoști alternative (deși uneori poate să nu fie cele mai bune) și să ai un fel de benchmark-uri. Distrează-te ;-)

Pieter Goosen Pieter Goosen
3 dec. 2015 19:34:13
Arată celelalte 1 comentarii