Cum obțin ID-ul unui articol (pagină sau CPT) folosind titlul sau slug-ul?

6 mar. 2011, 12:35:38
Vizualizări: 26.5K
Voturi: 7

Am căutat în Codex, nu am reușit să folosesc get_page_by_title() și sunt destul de surprins că nu pare să existe o funcție WordPress standard pentru această sarcină.

Am nevoie să obțin ID-ul oricărui articol/ CPT sau pagină folosind fie slug-ul, fie titlul paginii/articolului. Ideal, caut ceva de genul:

get_post_ID_by_title('Titlul articolului meu', 'customposttype');

Ce ar trebui să fac?

3
Comentarii

Cum foloseai funcția get_page_by_title și este post type-ul custom ierarhic? Nu cred că get_page (apelat de get_page_by_title) va funcționa pentru tipurile non-ierarhice.

t31os t31os
6 mar. 2011 13:00:16

Da, post type-ul custom în discuție este non-ierarhic.

jnthnclrk jnthnclrk
6 mar. 2011 13:15:03

Ignoră comentariul anterior legat de ierarhie, nu ar trebui să conteze. Cum apelai funcția get_page_by_title?

t31os t31os
7 mar. 2011 01:27:38
Toate răspunsurile la întrebare 5
10
13

Actualizare: Începând cu WordPress 3.0, puteți utiliza funcția încorporată get_page_by_title cu al treilea parametru $post_type:

$post = get_page_by_title( 'Titlul Postării', OBJECT, 'post_type' );

$post_id = $post ? $post->ID : 0;

Răspunsul Original

puteți utiliza această funcție care a apărut prin căutarea pe Google "get post by title"

/**
* Obține o postare pe baza titlului ei.
*
* @uses $wpdb
*
* @param string $post_title Titlul paginii
* @param string $post_type tipul postării ('post','page','orice tip personalizat')
* @param string $output Opțional. Tipul de ieșire. OBJECT, ARRAY_N sau ARRAY_A.
* @return mixed
*/
function get_post_by_title($page_title, $post_type ='post' , $output = OBJECT) {
    global $wpdb;
        $post = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type= %s", $page_title, $post_type));
        if ( $post )
            return get_post($post, $output);
 
    return null;
}
6 mar. 2011 13:01:14
Comentarii

Până acum am reușit să evit utilizarea interogărilor la baza de date, deoarece prefer să folosesc funcțiile standard din WP. Este într-adevăr singura modalitate de a obține ceea ce am nevoie?

jnthnclrk jnthnclrk
6 mar. 2011 13:14:07

Codul postat este practic o copie directă a get_page_by_title funcției, diferența majoră fiind că va funcționa și pentru tipurile non-hierarhice, așa că merită să o ai în colecția ta de funcții.

t31os t31os
6 mar. 2011 13:25:20

@t31os Nu am spus niciodată că este a mea, doar am adăugat parametrul $post_type și da, o adaug în colecția mea.

Bainternet Bainternet
6 mar. 2011 13:45:12

Nu te acuzam de nimic, prietene, dimpotrivă susțineam răspunsul tău.. ;) Ți-am dat deja +1.. :)

t31os t31os
6 mar. 2011 14:13:06

@t31os Știu, e doar o glumă proastă :)

Bainternet Bainternet
6 mar. 2011 14:29:06

În ce fel diferă aceasta de funcția nativă get_page_by_title()?.. get_page() este practic un alias pentru get_post(), nu văd cum această modificare ar avea vreun impact.

Rarst Rarst
6 mar. 2011 21:50:17

@Rarst Acum că ai menționat asta, este același lucru, nu văd nicio diferență.

Bainternet Bainternet
6 mar. 2011 21:57:58

@t31os deci unde intervine chestia non-hierarhică pe care ai menționat-o dacă funcția este în esență aceeași?..

Rarst Rarst
6 mar. 2011 22:09:09

Nu știu la ce mă gândeam dimineața, get_page apelează get_post oricum și nu am niciun indiciu de ce credeam că get_page funcționează doar pentru tipurile ierarhice, nu cred că este adevărat așa cum se întâmplă.

t31os t31os
7 mar. 2011 01:26:35

Aceasta se poate face ușor cu obiectul paginii. Vezi răspunsul meu mai jos.

Phill Healey Phill Healey
30 iul. 2017 02:03:37
Arată celelalte 5 comentarii
1

Îți lipsește un parametru al funcției. Pune null pentru al doilea parametru opțional $output și această funcție ar trebui să funcționeze pentru tine.

get_page_by_title('Titlul postării mele', null, 'customposttype');

Tocmai am întâmpinat aceeași problemă și adăugarea lui null a rezolvat-o pentru mine.

17 iun. 2011 20:30:33
Comentarii

Acel null ar trebui să fie OBJECT pentru claritate. Dar, da, el practic introducea tipul de post ca tip de ieșire prin omiterea tipului de ieșire.

Phill Healey Phill Healey
30 iul. 2017 02:05:21
1

De obicei, evit interogările directe pe baza de date. În schimb, folosesc obiectul WP_Query pentru a procesa lucrurile în locul meu.

Aceasta este, în esență, o funcție pe care o folosesc într-unul dintre temele mele pentru a obține un post pe baza unui slug dat:

function get_post_id( $slug, $post_type ) {
    $query = new WP_Query(
        array(
            'name' => $slug,
            'post_type' => $post_type
        )
    );

    $query->the_post();

    return get_the_ID();
}

Aceasta va crea o interogare folosind API-ul WordPress pentru a prelua un post de un anumit tip cu un slug specific, va rula funcțiile obișnuite ale buclei pe rezultat și va returna ID-ul postului. De asemenea, ai putea să o modifici puțin pentru a returna întregul post, dar asta depinde de tine.

17 iun. 2011 20:44:52
Comentarii

În loc să folosești $query->the_post() care modifică bucla și va afecta orice funcții get_the_xxx după aceasta, mai bine folosește:

if ($query->have_posts())
 {
  return $query->posts[0]->ID;
 }
 else
 {
  return 0;
 }
Mikepote Mikepote
14 dec. 2015 15:07:11
0

Acest lucru este de câțiva ani, dar încă apare când cauți pe Google. Deci, iată o metodă simplă pentru a face acest lucru:

$page = get_page_by_title( 'titlul postării mele' );

sau

$page = get_post_ID_by_title('titlul postării mele', OBJECT, 'tipcustomdepostare');

Apoi folosește obiectul $page pentru a obține ID-ul:

$page->ID
30 iul. 2017 02:02:45
0

În prezent (WP >4.9.2) puteți găsi orice post/pagină etc. după titlu/slug în felul următor:

$page = get_posts(
    array(
        //'name'      => 'your-post-slug', // după slug-ul postului
        'title'      => 'Titlul postului tău', // după titlul postului
        'post_type' => 'page' // tipul de post dorit
    )
);

if ($page = $page[0]) // Primul/cel mai mic ID este luat dacă există mai multe obiecte
{
    // Apoi faci ce este necesar...
    // $id = $page->id;
    // $content = $page->post_content;
    // sau $content = apply_filters('the_content', $page->post_content);
    // etc.
}
3 feb. 2018 23:59:07