Überprüfen Sie das Vorhandensein eines Beitrags anhand der ID in WordPress

Lesezeit: 7 Minuten

Ich habe eine ID:

$id = 151;

Ich möchte die Existenz wie folgt überprüfen:

$content = get_post($id);
if ($content)
    echo "post $id already exists";
else
    echo "post $id does not exists or was deleted";

Aber in den WP-Foren scheint immer lieber nach DB zu fragen:

global $wpdb;
$post_exists = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE id = '" . $id . "'", 'ARRAY_A');
if ($post_exists)
    echo "post $id exists";
else
    echo "post $id does not exist";

Was ist also die beste Methode? In der Tat bevorzuge ich die Leichtigkeit des ersten.

  • Ich halte es für sehr unverantwortlich, die Effizienz der Anrufe nicht zu berücksichtigen, während sie auf dem Server verarbeitet werden. Generische C/C++-Implementierungen sind normalerweise nicht für alles optimiert und die Skalierbarkeit von Aufrufen muss berücksichtigt werden. Es gibt ein Gleichgewicht zwischen Optimierung und Wartbarkeit, aber eine offene Aussage zu treffen, dass sich die PHP-Welt nicht um die Ressourcennutzung kümmern sollte, ist einfach naiv und letztendlich faul. Sie können Ihre Argumentation auf die Spitze treiben und ein Team von PHP-Programmierern Junk-Code veröffentlichen lassen und sich darauf verlassen, dass die zugrunde liegenden Betriebssystembibliotheken dies tun werden

    – lagpro

    14. Februar 2014 um 6:08 Uhr

Ich denke, das Beste ist, die Datenbank so wenig wie möglich direkt abzufragen

Sie können die Funktion get_post_status() verwenden.

Es gibt false zurück, wenn der Beitrag nicht existiert

if ( get_post_status ( $post_id ) ) {
    // do stuff
}

oder um sicherzustellen, dass der Beitrag veröffentlicht wird

if ( 'publish' == get_post_status ( $post_id ) ) {
    // do stuff
}

http://codex.wordpress.org/Function_Reference/get_post_status

  • Ich habe die Quelle überprüft get_post_status und es nutzt get_post. Warum nicht einfach direkt verwenden null !== get_post( $post_id )?

    – Jürgen Paul

    15. Februar 2016 um 10:31 Uhr

  • @Michelle Ich habe dasselbe gedacht, aber es gibt eine Reihe zusätzlicher Daten zurück. Wäre es nicht genauso sauber, das zu tun, was csag vorgeschlagen hat? So oder so ist es sauber und verwendet WordPress und nicht die wpdb. 🙂

    – cbloss793

    6. November 2017 um 19:19 Uhr

  • Ich stimme fast immer der Meinung zu, dass Sie eine direkte DB-Abfrage nach Möglichkeit vermeiden sollten. Aber in diesem Fall denke ich, dass es sich lohnt, eine benutzerdefinierte Funktion zu schreiben, die effizienter ist als get_post. Die Kernfunktion post_exists ruft die DB direkt auf, also sollten wir dasselbe tun, um zu prüfen, ob eine Post-ID existiert. stackoverflow.com/a/69328684/947370

    – Kandiszucker

    25. September 2021 um 17:55 Uhr


if( is_null(get_post($id))){

      echo "post $id does not exists or was deleted";

}else{

       echo "post $id already exists";

}

  • Dies kann zwar die Frage beantworten, es ist jedoch besser, eine Beschreibung hinzuzufügen, wie diese Antwort zur Lösung des Problems beitragen kann. Bitte lesen Sie Wie schreibe ich eine gute Antwort, um mehr zu erfahren.

    – Roshana Pitigala

    2. Juli 2018 um 18:50 Uhr

  • Beachten Sie, dass bei diesem Ansatz Beiträge im Papierkorb weiterhin als vorhanden betrachtet werden.

    – CragMonkey

    5. Januar 2019 um 19:51 Uhr

Benutzeravatar von AlFra
AlFra

Ich weiß, dass dies ein sehr alter Beitrag ist, aber trotzdem … Wenn Sie überprüfen möchten, ob ein Beitrag mit einer bestimmten ID existiert, können Sie auch die WordPress-Funktion get_permalink verwenden.

Beispiel:

if( get_permalink( $post_id ) ):
echo "does exist";
else:
echo "does not exist";
endif;

Beachten Sie, dass die Funktion get_permalink auch Links zu Seiten und Anhängen und nicht nur Beiträge zurückgibt.

  • Beachten Sie, dass get_permalink() get_post aufruft. Wenn Sie dies also aus Leistungsgründen tun, wird trotzdem immer noch der gleiche get_post()-Aufruf ausgeführt.

    – Matte Tasten

    8. August 2018 um 21:44 Uhr

Verwenden Sie die WP_Abfrage Klasse für eine effiziente, SQL-freie Lösung:

$id = 151;

$post_exists = (new WP_Query(['post_type' => 'any', 'p'=>$id]))->found_posts > 0;

if ($post_exists)
    echo "post $id already exists";
else
    echo "post $id does not exists or was deleted";

Beachten Sie, dass beides get_post_status und get_permalink fremde Daten laden.

Ich würde es vorziehen, die Datenbank über den get_post-Aufruf abzufragen.

Der Beitragsinhalt kann von großer Größe sein. Den gesamten Inhalt des Beitrags abzufragen und in eine Zeichenfolge zu schieben, nur um zu prüfen, ob er existiert, ist unglaublich verschwenderisch und ineffizient.

Wenn Sie die Datenbank nicht direkt abfragen möchten, wäre die Verwendung von get_post_field zum Abrufen eines der kleineren Felder möglicherweise genauso effektiv, aber weniger verschwenderisch.

  • Ich denke nicht, dass wir uns in der PHP-Welt zu sehr um die Verwendung von Ressourcen kümmern sollten. Überlassen Sie das den C-Programmierern. PHP und MySQL sind schlau genug, um es selbst zu verwalten. Es gibt andere Überlegungen wie DRY und die Reinigung des Codes. Danke

    – Igor Parra

    9. Januar 2014 um 13:38 Uhr


  • Es geht nicht darum, dass PHP und MySQL Ressourcen verwalten. Es geht darum, dass der Programmierer zwingend unnötige Ressourcen verbraucht. Es ist, als würde man überall SELECT * verwenden. Die Einstellung, einfach alles zu packen, wird Sie schließlich auf alles andere als auf kleine klitzekleine Seiten bringen, besonders wenn sich Ihre Datenbank und HTTP-Server auf verschiedenen Hosts befinden.

    – davidjbullock

    14. Februar 2014 um 0:45 Uhr

Benutzeravatar von squarecandy
Quadratisch

Ich beschloss, mich hier vom bestehenden Kerncode inspirieren zu lassen. Es gibt bereits eine Funktion für post_existiert aber es überprüft nur Titel, Inhalt, Status usw. Sie können siehe die vollständige Quelle hier.

Beachten Sie, dass der Code im Kern, um nur zu prüfen, ob etwas existiert, tatsächlich direkt die Datenbank abfragt und nur die ID abruft – nicht alle Daten für den gesamten Beitrag. Das ist sehr effizient und es wert, diese Methode zu kopieren. Hier ist, was ich mir ausgedacht habe:

<?php
if ( ! function_exists( 'post_id_exists' ) ) :
    function post_id_exists( $post_id ) {
        global $wpdb;
        $post_id = (int) $post_id; // cast as INT to sanitize
        if ( $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE ID=%s", array( $post_id ) ) ) ) {
            return 1;
        }
        return 0;
    }
endif;

Die akzeptierte Antwort lautet “so wenig wie möglich die Datenbank direkt abfragen”. In groben Zügen für neue WordPress-Entwickler ist dies ein guter Rat. Aber ich denke, der bessere Rat ist, zu vermeiden, eine Reihe sich wiederholender direkter Datenbankaufrufe über Ihren benutzerdefinierten Code zu verteilen, und direkte Datenbankaufrufe zu vermeiden, wenn es eine vorhandene Funktion gibt, die bereits genau das tut, wonach Sie suchen. In diesem Fall haben wir eine Instanz einer Funktion gefunden, von der wir uns vielleicht wünschten, dass sie im Kern enthalten wäre, aber es gibt keine effiziente Möglichkeit, dies mit Kernfunktionen zu tun. Für diesen seltenen Fall sollten wir eine Funktion schreiben, die die Datenbank abfragt, und den Kerncode als Modell verwenden, um dies effizient und sicher zu tun.

get_post, get_permalink und andere hier empfohlene Funktionen haben alle spezifische Zwecke, die viel weniger effizient sind als eine speziell entwickelte Funktion mit einer Abfrage, die so schnell wie möglich ist. Und wie andere Kommentatoren bemerkten – einige andere Vorschläge mögen get_post_status eigentlich anrufen get_post in ihnen, das ist also noch weniger effizient.

  • Ich denke nicht, dass wir uns in der PHP-Welt zu sehr um die Verwendung von Ressourcen kümmern sollten. Überlassen Sie das den C-Programmierern. PHP und MySQL sind schlau genug, um es selbst zu verwalten. Es gibt andere Überlegungen wie DRY und die Reinigung des Codes. Danke

    – Igor Parra

    9. Januar 2014 um 13:38 Uhr


  • Es geht nicht darum, dass PHP und MySQL Ressourcen verwalten. Es geht darum, dass der Programmierer zwingend unnötige Ressourcen verbraucht. Es ist, als würde man überall SELECT * verwenden. Die Einstellung, einfach alles zu packen, wird Sie schließlich auf alles andere als auf kleine klitzekleine Seiten bringen, besonders wenn sich Ihre Datenbank und HTTP-Server auf verschiedenen Hosts befinden.

    – davidjbullock

    14. Februar 2014 um 0:45 Uhr

Benutzeravatar von dldnh
dlnh

Ich denke, wenn sie Ihnen eine Funktion für einen Anruf geben, rufen Sie ihn an; Verwenden Sie die Datenbank für Dinge, die nicht von einer Funktion bereitgestellt werden.

  • +1 Ja, ich denke das gleiche, aber suche nach wordpress check if post exists und erscheint eine Menge Lösungen wie die zweite in der http://wordpress.org/support

    – Igor Parra

    9. März 2012 um 17:40 Uhr


  • Ich fühle, dass Ihr Instinkt richtig ist, und kann nicht erklären, warum jemand den anderen Weg empfehlen würde. Der einzige Weg, dies zu wissen, wäre, jemanden zu fragen, der das empfiehlt. Ich wäre neugierig auf die Antwort, wenn Sie jemals von einer hören.

    – dlnh

    9. März 2012 um 17:50 Uhr


  • OK, mein Freund, machen wir es richtig, indem wir die API verwenden. @Pekka denkt auch dasselbe (warum hat er seine Antwort gelöscht?). Prost!

    – Igor Parra

    9. März 2012 um 17:56 Uhr


1401080cookie-checkÜberprüfen Sie das Vorhandensein eines Beitrags anhand der ID in WordPress

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

Privacy policy