9
votes

Vérifiez l'existence d'un message par ID dans WordPress

J'ai une pièce d'identité: xxx

Je veux vérifier l'existence comme ceci: xxx

mais dans les forums wp semble toujours préférer Demandez à dB: xxx

alors quelle est la meilleure méthode? En effet, je préfère la facilité du premier.


1 commentaires

Je crois qu'il est très irresponsable de ne pas examiner l'efficacité des appels comme ils sont traités sur le serveur. Les implémentations génériques C / C ++ ne sont généralement pas optimisées pour tout et l'évolutivité des appels doit être prise en compte. Il existe un équilibre entre l'optimisation et la maintenabilité, mais pour faire une déclaration ouverte que le monde PHP ne devrait pas se soucier de la consommation de ressources est naïf et finalement paresseux. Vous pouvez prendre votre argumentation à un extrême et disposer d'une équipe de programmeurs de PHP. Remettez le code indésirable et reposer sur l'assurance que les bibliothèques du système d'exploitation sous-jacentes vont


7 Réponses :


-1
votes

Je pense que s'ils vous donnent une fonction à un appel, vous l'appelez; Utilisez la base de données pour des choses qui ne sont pas fournies par une fonction.


3 commentaires

+1 Oui, je pense que la même chose, mais la recherche de WordPress vérifie si la poste existe et apparaît beaucoup de solutions telles que la seconde dans le http://wordpress.org/support


Je sens que vos instincts sont corrects et je ne peux pas expliquer pourquoi quelqu'un recommanderait l'inverse. Seul moyen de savoir serait de demander à quelqu'un qui le recommande. Je serais curieux de connaître la réponse, si vous en entendez jamais.


Ok mon ami le faisons de la bonne manière, en utilisant l'API. @Pekka pense aussi la même chose (pourquoi il a supprimé sa réponse?). À votre santé!



0
votes

Je préférerais interroger la base de données sur l'appel GET_POST.

Le contenu post peut être de grande taille. Interrogation et poussant tout le contenu du post dans une chaîne juste pour vérifier si elle existe d'incroyablement gaspillé et inefficace.

Si vous ne souhaitez pas interroger la base de données directement, peut-être utiliser get_post_field pour tirer l'un des plus petits champs serait aussi efficace, mais moins gaspillé.


2 commentaires

Je ne pense pas que dans le monde du PHP, nous devrions trop nous soucier des utilisations des ressources. Laisser cela pour les programmeurs C. PHP et MySQL sont assez intelligents pour la gérer par eux-mêmes. Il existe d'autres considérations comme sèches et le nettoyage du code. THX


Ce n'est pas une question de PHP et de MySQL Gestion des ressources. C'est une question du programmeur impérieusement consommer des ressources inutiles. C'est comme en utilisant Select * partout. Il suffit de saisir tout ce que tout l'attitude vous brisera sur tout ce que de petits sites idiotty bitty, surtout si votre base de données et vos serveurs HTTP sont sur différents hôtes.



41
votes

Je pense que le meilleur est d'interroger la base de données directement aussi aussi possible que possible

Vous pouvez utiliser la fonction get_post_status ().

Il retourne faux si le message n'existe pas xxx

ou, pour être sûr que le message est publié xxx

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


3 commentaires

J'ai vérifié la source de get_post_status et il utilise get_post . Pourquoi ne pas simplement utiliser directement null! == get_post ($ post_id) ?


@Michelle je pensais la même chose, mais cela retourne un tas de données supplémentaires. Ne serait-il pas aussi propre pour faire ce que le CSAG a suggéré? De toute façon est propre et utilise WordPress et non le WPDB. :)


J'ai presque toujours d'accord avec le sentiment que vous devriez éviter une requête DB directe lorsque cela est possible. Mais dans ce cas, je pense que cela vaut la peine d'écrire une fonction personnalisée qui sera plus efficace que get_post . La fonction principale post_exists appelle directement la base de données directe, alors je pense que nous devrions faire la même chose pour vérifier si une carte d'identité existe. Stackoverflow.com/a/69328684/947370



2
votes

Je sais que c'est très ancien post, mais toujours ... Si vous souhaitez vérifier si la poste avec certains identifiaires existe, vous pouvez également utiliser get_permalink WordPress Fonction.

Exemple: P>

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


1 commentaires

Vaut à noter que get_permalink () appelle get_post. Donc, si vous le faites pour des raisons de performance, cela fait toujours que le même appelez_post () appelez de toute façon.



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

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

}else{

       echo "post $id already exists";

}

2 commentaires

Bien que cela puisse répondre à la question, il est préférable d'ajouter une description sur la manière dont cette réponse peut aider à résoudre le problème. Veuillez lire Comment puis-je écrire une bonne réponse pour en savoir plus.


Sachez que, avec cette approche, les messages dans la corbeille sont toujours considérés comme existants.



2
votes

Utilisez le wp_query classe pour une solution efficace et sans SQL: < Pré> xxx

Notez que get_post_status et get_permalink chargez des données extrêmes.


1 commentaires

Ceci est moins efficace l'appelant directement la base de données, mais c'est une bonne pratique pour utiliser WP_Query dans la mesure du possible. Vous pouvez améliorer légèrement l'efficacité en ajoutant un paramètre 'champs' => 'IDS'.



0
votes

J'ai décidé de regarder le code de base existant pour inspiration ici. Il existe déjà une fonction pour post_existes mais il vérifie que les titres, le contenu, le statut, etc. Vous pouvez Voir le Source complète ici .

Notez que, dans le but de simplement vérifier si quelque chose existe, le code dans le noyau interrogeait en effet directement la base de données et tirez uniquement l'identifiant - pas toutes les données de l'ensemble de l'article. C'est très efficace et digne de la copie de cette méthode. Voici ce que je suis venu avec: xxx

La réponse acceptée dit "Requête le DB directement le moins possible". Dans de larges traits pour les nouveaux développeurs de WordPress, c'est un bon conseil. Mais je pense que le meilleur conseil est d'éviter de disperser un tas d'appels de base de données directs répétitifs dans votre code personnalisé et d'éviter les appels de base de données directs lorsqu'il y a une fonction existante qui fait déjà exactement ce que vous recherchez. Dans ce cas, nous avons trouvé une instance d'une fonction que nous souhaitons peut-être être dans le noyau, mais il n'y a pas de moyen efficace de le faire avec des fonctions principales. Pour ce cas rare, nous devrions écrire une fonction qui interroge la base de données et utilise le code principal comme modèle pour savoir comment le faire efficacement et sécurisé.

get_post , GET_PERMALINK et d'autres fonctions recommandées ici ont tous des objectifs spécifiques qui seront bien moins efficaces que la fonction intégrée à usage avec une requête conçue pour être aussi vite que possible. Et comme les autres commentateurs notés - certaines autres suggestions telles que get_post_status appellent effectivement get_post à l'intérieur d'eux, c'est donc encore moins efficace.


0 commentaires