Ü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
}
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
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.
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";
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
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
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
14010800cookie-checkÜberprüfen Sie das Vorhandensein eines Beitrags anhand der ID in WordPressyes
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