Interrogazione di WordPress in un singolo post di slug


87

Per il momento in cui voglio mostrare un singolo post senza usare un loop, uso questo:

<?php
$post_id = 54;
$queried_post = get_post($post_id);
echo $queried_post->post_title; ?>

Il problema è che quando sposto il sito, di solito l'ID cambia. C'è un modo per interrogare questo post per slug?


3
Perché gli ID cambiano quando si sposta il sito? A meno che tu non stia spostando il sito utilizzando la funzione di importazione / esportazione di WP (che non è particolarmente affidabile e consiglierei di evitare). Se stai semplicemente migrando il database non cambierà nulla.
Ennui

Risposte:


120

Dal codice WordPress:

<?php
$the_slug = 'my_slug';
$args = array(
  'name'        => $the_slug,
  'post_type'   => 'post',
  'post_status' => 'publish',
  'numberposts' => 1
);
$my_posts = get_posts($args);
if( $my_posts ) :
  echo 'ID on the first post found ' . $my_posts[0]->ID;
endif;
?>

WordPress Codex Ottieni messaggi


1
Questo mostra l'ID - $ my_posts [0] -> ID; - ma come faccio a visualizzare il contenuto delle pagine? Ho provato di tutto e non funziona niente!
James Wilson,

1
@JamesWilson inizia a usare kint. echo $my_posts[0]->post_content
Toskan

Questo sembra restituire risultati multipli, e quindi ambigui, se alcuni slug sono abbastanza simili (ad esempio "lavoro" vs "lavoro")
Simon H

2
Non so perché, ma ho dovuto cambiare "name" in "post_name" affinché questa query funzionasse per me
Mike

Funziona per ottenere l'immagine in primo piano $ feat_image = wp_get_attachment_url (get_post_thumbnail_id ($ my_posts [0] -> ID));
Omar

70

Che ne dite di?

<?php
   $queried_post = get_page_by_path('my_slug',OBJECT,'post');
?>

9
Presta attenzione alle pagine dei bambini o ai tipi di post personalizzati gerarchici: my-slugdovrebbe diventare my-parent-slug/my-slug: codex.wordpress.org/Function_Reference/…
Erenor Paz

2
la mia esperienza da quando ho letto questo post supporta @Erenor Paz - può essere davvero carino e semplice ma diventa complesso quando si dipende dalla consistenza dello slug - che può cambiare semplicemente cambiando il post genitore ... sigh - forse noi potrebbe convincere gli sviluppatori di WordPress a consentire il carattere jolly nel percorso, ad esempio: get_page_by_path ('* / my_slug');
uguale a b

Non molto affidabile
Amin

7

un metodo meno costoso e riutilizzabile

function get_post_id_by_name( $post_name, $post_type = 'post' )
{
    $post_ids = get_posts(array
    (
        'post_name'   => $post_name,
        'post_type'   => $post_type,
        'numberposts' => 1,
        'fields' => 'ids'
    ));

    return array_shift( $post_ids );
}

6

Poiché l'API di wordpress è cambiata, non è possibile utilizzare get_posts con il parametro 'post_name'. Ho modificato un po 'la funzione di Maartens:

function get_post_id_by_slug( $slug, $post_type = "post" ) {
    $query = new WP_Query(
        array(
            'name'   => $slug,
            'post_type'   => $post_type,
            'numberposts' => 1,
            'fields'      => 'ids',
        ) );
    $posts = $query->get_posts();
    return array_shift( $posts );
}

Per prestazioni aggiuntive aggiungerei anche 'no_found_rows' => trueagli argomenti get_posts.
Philipp
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.