it-swarm.com.de

Hinzufügen eines benutzerdefinierten Beitragstyps zur aktuellen Abfrage

Ich versuche, ein Plugin zu erstellen, das einen neuen benutzerdefinierten Beitragstyp hinzufügt und an denselben Positionen wie ein normaler Beitrag angezeigt werden soll (Startseite, Archive usw.).

Gibt es Funktionen für mich, um die Beitragstypen abzurufen, die derzeit in der Abfrage aufgerufen werden, damit ich meine CPT ändern und der aktuellen Abfrage hinzufügen kann? (Beispiel im 2. Kommentar angegeben, wenn meine Frage verwirrend klingt)

Ich kann den folgenden Code nicht verwenden (d. H. Die Beitragstypen auflisten), da ich nicht vorhersagen kann, welche Beitragstypen der Benutzer haben würde:

add_filter( 'pre_get_posts', 'my_get_posts' );

function my_get_posts( $query ) {

if ( is_home() && $query->is_main_query() )
    $query->set( 'post_type', array( 'post', 'page', 'album', 'movie', 'quote' ) );

return $query;
}

Ebenso kann ich den folgenden Code nicht verwenden, da dies all post-Typen zurückgibt, einschließlich derer, die möglicherweise nicht auf der Startseite angezeigt werden sollen:

if ( !is_admin() && empty( $query->query_vars['suppress_filters'] ) && $query->is_main_query() ) {
    $post_type = get_query_var('post_type');
    $post_types = get_post_types( array( 'public' => true ) );

    if ($post_type) {
        $post_type = $post_type;
    } else {
        $post_type = $post_types;
    }

    $query->set('post_type',$post_type);
    return $query;
    }
}

Gibt es Ideen, wie ich mein CPT zur Abfrage hinzufügen kann, ohne andere Beitragstypen zu beeinflussen? Danke fürs Helfen!

4
Billy

Sie sind mit pre_get_posts eigentlich nicht so weit weg. Sie müssen nur die aktuellen Beitragstypen in der Abfrage abrufen, bevor Sie Ihre eigenen hinzufügen.

Außerdem würde ich empfehlen, einen $priority von 99 zu verwenden, damit die Aktion nach allen anderen pre_get_posts-Hooks verknüpft wird. Dies bedeutet, dass Benutzer, die eigene CPTs (oder eingebaute Post-Typen) hinzufügen, von der unten stehenden Funktion (außer Ihnen) erkannt und eingeschlossen werden kann dies nach Bedarf ändern).

add_action('pre_get_posts', 'djg_includ_my_cpt_in_query', 99);
function djg_includ_my_cpt_in_query($query){

    if(is_home() && $query->is_main_query()) :              // Ensure you only alter your desired query

        $post_types = $query->get('post_type');             // Get the currnet post types in the query

        if(!is_array($post_types) && !empty($post_types))   // Check that the current posts types are stored as an array
            $post_types = explode(',', $post_types);

        if(empty($post_types))                              // If there are no post types defined, be sure to include posts so that they are not ignored
            $post_types[] = 'post';         
        $post_types[] = 'document';                         // Add your custom post type

        $post_types = array_map('trim', $post_types);       // Trim every element, just in case
        $post_types = array_filter($post_types);            // Remove any empty elements, just in case

        $query->set('post_type', $post_types);              // Add the updated list of post types to your query

    endif; 

    return $query;

}

BEARBEITEN

Beim Erstellen der letzten Abfrage prüft WordPress, ob "post_type" leer ist. In diesem Fall wird der folgende Code ausgeführt:

$where .= " AND $wpdb->posts.post_type = 'post'";
$post_type_object = get_post_type_object ( 'post' );

Wenn wir also einen CPT hinzufügen, geht WordPress davon aus, dass wir Posts ignorieren möchten, da dieser nicht explizit deklariert ist. Das ist, wo mein Szenario anders war - ich hatte zuvor explizit andere Beitragstypen deklariert, damit sie in den Aufruf $post_types = $query->get('post_type'); einbezogen wurden.

In Ihrem Fall können wir also vernünftigerweise zusammenfassen, dass der Benutzer diesen Teil der Abfrage nicht ändern möchte, wenn $post_types leer ist, sodass "post" manuell zum $post_types-Array hinzugefügt werden kann. Dies sollte (hoffentlich!) Den Trick machen.

4
David Gard