Stoppen Sie die WordPress-Suche, die einen benutzerdefinierten Beitragstyp anzeigt

Lesezeit: 6 Minuten

Ich habe einen benutzerdefinierten Beitragstyp, den ich für einige Textblöcke auf einer Seite verwende, die mit dem Uncode-Design erstellt wurde. Ich brauche diese Blöcke, um öffentlich zu sein, damit sie auf der Seite angezeigt werden, aber ich möchte verhindern, dass sie in den Suchergebnissen erscheinen.

Die search.php ist nicht wie eine normale WordPress-Suchdatei, es ist die Uncode-Theme-Datei und enthält keine normalen Abfragen. Ich glaube nicht, also denke ich, dass ich vielleicht eine Funktion brauche?

Kann jemand bitte raten, wie man dies erreicht?

Der CPT ist ‘statischer Inhalt’

Vielen Dank!

Benutzeravatar von Greg Burkett
Gregor Burkett

Die Antwort hier hängt davon ab, ob Sie das CPT über Ihren eigenen Code erstellen oder ob ein anderes Plugin das CPT erstellt. Unter diesem Link finden Sie eine großartige Erklärung beider Ansätze:

http://www.webtipblog.com/exclude-custom-post-type-search-wordpress/

Der Grundgedanke ist folgender:

Wenn Sie Ihr eigenes CPT erstellen, können Sie dem Aufruf von register_post_type() ein Argument hinzufügen 'exclude_from_search' => true

Wenn ein anderes Plugin / Design den CPT erstellt, müssen Sie diese Variable exclude_from_search später als Teil eines Filters für den CPT wie folgt festlegen:

// functions.php

add_action( 'init', 'update_my_custom_type', 99 );

function update_my_custom_type() {
    global $wp_post_types;

    if ( post_type_exists( 'staticcontent' ) ) {

        // exclude from search results
        $wp_post_types['staticcontent']->exclude_from_search = true;
    }
}

  • Mein Wort, so einfach danke!! Ich hatte das CPT selbst registriert, also nur ‘exclude_from_search’ => true hinzugefügt

    – iglobob

    3. Oktober 2016 um 20:04 Uhr


  • Also habe ich gerade bemerkt, dass das Hinzufügen dieser Zeile exclude_from_search tatsächlich verhindert, dass der Inhaltsblock auf der Seite angezeigt wird, wo er sein sollte. Es verschwindet. Ich möchte, dass der CPT auf der Seite erscheint, aber nicht in einer Suche. Ist das möglich?

    – iglobob

    3. Oktober 2016 um 23:52 Uhr

  • Hmm.. das ist seltsam, das sollte es sicherlich nicht tun. Haben Sie zufällig das Komma am Ende der Zeile von ‘exclude_from_search’ => true in Ihrem Argumentarray vergessen? Wenn Sie diese Zeile vollständig aus den CPT-Argumenten entfernen, kommt der Inhalt dann zurück?

    – Greg Burkett

    4. Oktober 2016 um 2:26 Uhr

  • Hallo Greg, nein, ich hatte das Komma nicht weggelassen, nur doppelt überprüft. Der Inhalt kommt zurück, wenn ich die Exclude-Zeile entferne.

    – iglobob

    5. Oktober 2016 um 9:02 Uhr

  • Warnung! Diese akzeptierte Antwort hat einen Nebeneffekt: Sie macht auch die Paginierung bei Taxonomien nicht verfügbar, die einen Beitragstyp enthalten, der von der Suche ausgeschlossen wurde. Hier einige weitere Details: stackoverflow.com/questions/8269713/…

    – Juri

    15. Oktober 2021 um 20:10 Uhr

Ich denke nicht, dass die akzeptierte Antwort richtig ist. exclude_from_search verhindert alles $query = new WP_Query aus der Rückgabe von Ergebnissen.

Der Kern sagt:

…ruft jeden Typ ab außer Revisionen und Typen mit ‘exclude_from_search’ auf TRUE gesetzt)

Dies ist ein häufiges Problem und eine Verwechslung mit dem Front-End-Suchergebnisseite vs Suchbeiträge in der Datenbank.

Das Präsentieren von Inhalten mithilfe benutzerdefinierter Abfragen am Frontend, Anforderungen exclude_from_search = false oder verwenden Sie einen anderen Ansatz und rufen Sie den Inhalt direkt per ID ab.

Sie müssen stattdessen den Such-Frontend-Mechanismus filtern. Das ist ein Stimmt Beitragstypen von der Suche ausschließen, ohne „bekannte“ Typen manuell neu zu erstellen:

function entex_fn_remove_post_type_from_search_results($query){

    /* check is front end main loop content */
    if(is_admin() || !$query->is_main_query()) return;

    /* check is search result query */
    if($query->is_search()){

        $post_type_to_remove="staticcontent";
        /* get all searchable post types */
        $searchable_post_types = get_post_types(array('exclude_from_search' => false));

        /* make sure you got the proper results, and that your post type is in the results */
        if(is_array($searchable_post_types) && in_array($post_type_to_remove, $searchable_post_types)){
            /* remove the post type from the array */
            unset( $searchable_post_types[ $post_type_to_remove ] );
            /* set the query to the remaining searchable post types */
            $query->set('post_type', $searchable_post_types);
        }
    }
}
add_action('pre_get_posts', 'entex_fn_remove_post_type_from_search_results');

Und Bemerkung $post_type_to_remove="staticcontent"; kann geändert werden, um zu jedem anderen Pfostentyp zu passen.

Bitte machen Sie einen Kommentar Wenn ich hier etwas vermisse, kann ich keine andere Möglichkeit finden, solche Post-Type-Szenarien zu verhindern, Anzeigen von Inhalten nach Abfrage aber vor Suche/direktem Zugriff verbergen für Frontend-Benutzer.

  • Ich teile deine Meinung.

    – Uwe Schmelzer

    18. September 2018 um 22:39 Uhr

  • Laut dieser Codex-Seite ist exclude_from_search für Frontend-Suchergebnisse. Aber es hat eine gewisse Note.codex.wordpress.org/Function_Reference/register_post_type Exclude_from_search (boolesch) (Wichtigkeit) Ob Beiträge mit diesem Beitragstyp aus Frontend-Suchergebnissen ausgeschlossen werden sollen.

    – Iggy

    30. Juni 2019 um 13:15 Uhr

  • Ich denke, dies sollte für zukünftige Googler (wie mich) explizit angegeben werden: Diese Technik ist wahrscheinlich das, was Sie anstelle der akzeptierten Antwort wollen. Verwenden 'exclude_from_search' => true in der CPT-Konfiguration (wie von der akzeptierten Antwort empfohlen) wird auch die Beiträge aus den Taxonomiearchiven entfernen, was wahrscheinlich nicht das ist, was Sie wollen. Ich habe das gerade selbst erlebt (WP 5.3.2), und Sie können sehen, dass OP es auch in den Kommentaren der akzeptierten Antwort erlebt hat. Verwenden Sie den Ansatz in dieser Antwort, wenn Sie nur die Suchergebnisseite beeinflussen möchten.

    – Ian Drake

    13. April 2020 um 4:51 Uhr


  • Ich habe die akzeptierte Antwort ausprobiert, aber sie hat auch die Beiträge von den Archivseiten entfernt. Ich denke also, dass die akzeptierte Antwort nicht richtig ist. Ich frage mich, warum es so viele Upvotes hat. Diese Antwort hat bei mir funktioniert. Kopieren Sie einfach den Code in die functions.php und ersetzen Sie das Wort „staticcontent“ durch Ihren gewünschten Beitragstyp.

    – Davood Kazemi

    5. Juni 2021 um 13:10 Uhr

  • Dies ist die beste und funktionierende Lösung, da die akzeptierte Antwort Nebeneffekte hat: Sie macht auch die Paginierung bei Taxonomien nicht verfügbar, die Posttypen enthalten, die von der Suche ausgeschlossen wurden. Hier einige weitere Details: stackoverflow.com/questions/8269713/…

    – Juri

    15. Oktober 2021 um 20:09 Uhr


Zunächst einmal die Antwort von Jonas Lundman ist richtig und sollte die akzeptierte Antwort sein.

Das exclude_from_search Parameter funktioniert nicht richtig – er schließt den Beitragstyp auch von anderen Abfragen aus.

Es gibt ein Ticket für das WP-Problemverfolgungssystem, aber sie haben es als wontfix geschlossen, da sie dies nicht beheben können, ohne die Abwärtskompatibilität zu beeinträchtigen. Sehen diese Fahrkarte und Dieses hier für mehr Details.

Ich habe der von vorgeschlagenen Lösung zusätzliche Überprüfungen hinzugefügt Jonas LundmanWeil:

  • In realen Setups können andere Plugins versuchen, die Suchanfrage zu ändern, also ersetzen Sie einfach die post_type kann zu unerwarteten Ergebnissen führen.
  • Ich denke, es ist flexibler, eine Reihe von auszuschließenden Beitragstypen zu verwenden.
add_action('pre_get_posts', 'remove_my_cpt_from_search_results');

function remove_my_cpt_from_search_results($query) {
    if (is_admin() || !$query->is_main_query() || !$query->is_search()) {
        return $query;
    }

    // can exclude multiple post types, for ex. array('staticcontent', 'cpt2', 'cpt3')
    $post_types_to_exclude = array('staticcontent');

    if ($query->get('post_type')) {
        $query_post_types = $query->get('post_type');

        if (is_string($query_post_types)) {
            $query_post_types = explode(',', $query_post_types);
        }
    } else {
        $query_post_types = get_post_types(array('exclude_from_search' => false));
    }

    if (sizeof(array_intersect($query_post_types, $post_types_to_exclude))) {
        $query->set('post_type', array_diff($query_post_types, $post_types_to_exclude));
    }

    return $query;
}

  • Dies ist die einzige Antwort, die für mich funktioniert hat.

    – Daniel Muñoz Parsapoormoghadam

    31. Dezember 2021 um 15:40 Uhr

1396770cookie-checkStoppen Sie die WordPress-Suche, die einen benutzerdefinierten Beitragstyp anzeigt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy