web-dev-qa-db-fra.com

Obtenir un seul message par une méta valeur unique

Existe-t-il un moyen rapide de récupérer un message spécifique avec une méta-valeur unique? Je pourrais exécuter une méta_query puis parcourir la première valeur pour obtenir l'ID de la publication, mais je me demande s'il y en a une autre que je néglige.

Est-il possible d'ajouter une colonne à la table wp_posts? Ou existe-t-il un autre moyen d'ajouter un deuxième numéro unique à chaque publication?

Pour expliquer, je dois prendre une commande WooCommerce (qui est juste un type de message appelé 'shop_order') et l'envoyer à une 3ème partie. Ils renverront une référence unique de leur système, que j'ai jusqu'ici stockée en tant que méta. Normalement, je leur enverrais l’identifiant de poste en tant que numéro de commande, car lorsqu’ils renvoient leurs informations avec l’ID de poste en tant que numéro de commande, il est facile de définir ensuite le méta de poste avec les informations supplémentaires qu’ils envoient.

Cependant, il existe un autre plug-in (appelé numéros d'ordre séquentiel) qui filtre les ID de publication pour toujours afficher un numéro séquentiel. Cela est très logique d'un point de vue lisible par l'homme. Cependant, je ne peux pas envoyer ce numéro de commande séquentiel car, quand il me le revient, je ne peux pas utiliser cette valeur pour update_post_meta car ce n'est pas un ID de publication dans la base de données. Si je leur envoie le numéro de poste réel et que les deux parties doivent se parler en personne, elles ne référenceront pas le même numéro de commande, ce qui serait source de confusion, à mon avis (un peu comme cette question).

Encore une fois, pour essayer de reformuler ma question ... existe-t-il un moyen plus efficace d’obtenir une publication par une deuxième valeur unique qui n’est pas l’identité de la publication?

4
helgatheviking

Je suis juste incroyablement stupide ici car cela peut être facilement fait par un simple WP_Query:


new WP_Query( array( 'post_type' => 'shop_order', 'meta_key' => $meta_key, 'meta_value' => $meta_value ) )

Cependant, j'ai décidé de comparer le SQL généré par get_posts () avec une solution de filtre 'post_where' qui est:


SELECT wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'engine' AND ID IN (SELECT post_id FROM wp_postmeta WHERE meta_key = "horsepower" AND meta_value = "275")  ORDER BY wp_posts.post_date DESC LIMIT 0, 5
SELECT wp_posts.* FROM wp_posts WHERE ID IN (361,327)
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (327,361)

avec le code SQL généré réel de la nouvelle solution WP_Query () qui est:


SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1  AND wp_posts.post_type = 'engine' AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') AND ( (wp_postmeta.meta_key = 'horsepower' AND CAST(wp_postmeta.meta_value AS CHAR) = '275') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
SELECT FOUND_ROWS()
SELECT wp_posts.* FROM wp_posts WHERE ID IN (361,327)
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (327,361)

Ainsi, les deux solutions ont à peu près la même efficacité (la solution WP_Query () est probablement légèrement plus rapide) mais ne sont certainement pas aussi efficaces que le code SQL généré par l’homme.

2
user27457
function get_post_by_meta_value( $meta_key, $meta_value ) {
  $post_where = function ($where) use ( $meta_key, $meta_value ) {
    global $wpdb;
    $where .= ' AND ID IN (SELECT post_id FROM ' . $wpdb->postmeta
      . ' WHERE meta_key = "' . $meta_key .'" AND meta_value = "' . $meta_value . '")';
    return $where;
  };
  add_filter( 'posts_where', $post_where );
  $args = array(
    'post_type' => 'shop_order',
    'post_status' => 'published',
    'post_per_page' => -1,
    'suppress_filters' => FALSE
  );
  $posts = get_posts( $args );
  remove_filter( 'posts_where' , $posts_where );
  return $posts;
} 

get_post_by_meta_value() renvoie un tableau de toutes les publications du type post_type spécifié qui ont la méta_value spécifiée pour la méta_key spécifiée, qui sera un tableau à 1 élément si la méta_value est unique.

2
user27457

Oui. $post->GUID est un deuxième identifiant. Il s'agit en fait d'un identifiant global unique désigné par Wordpress. Ref: Tous les ID utilisés sont-ils uniques?

Il peut être référencé en toute sécurité depuis votre service tiers. Mais vous voudrez peut-être aussi garder $post->ID comme sauvegarde, au cas où quelqu'un altérerait par inadvertance le GUID (qui pourrait être plus ou moins probable): https://wordpress.stackexchange.com/a/209833/71131

0
Magne