J'utilise le plug-in WP de quelqu'un d'autre, qui stocke de nombreuses données associées dans wp_postmeta
en utilisant une "clé artificielle". Nous avons donc efficacement détourné wp_postmeta
pour créer une base de données relationnelle imbriquée. Donc, une ligne aura
meta_id = 999
post_id = 130
meta_key = 'event_id'
meta_value = '19'
Ensuite, 4 autres lignes réelles de wp_postmeta qui partagent ce post_id contiennent le reste des informations pour cette "ligne" virtuelle de données. Par exemple
meta_id = 989
post_id = 130
meta_key = 'Name'
meta_value = 'Fred'
Et nous aurons beaucoup de "lignes virtuelles" (des centaines) qui partagent toutes le event_id
de 19 (et bien sûr beaucoup d'autres avec différents event_id
s.
J'ai essayé beaucoup de requêtes SQL, mais je suis perplexe. Comment puis-je obtenir une table qui a groupé des informations pour un event_id commun? Il ne doit pas nécessairement avoir toutes les données , mais uniquement un élément, tel que le champ "Nom". J'ai essayé une sous-requête comme ceci:
SELECT meta_value from wp_postmeta
WHERE meta_key='name' AND
post_id IN
(SELECT post_id FROM wp_postmeta
WHERE meta_key='event_id' AND meta_value='19');
Cela a probablement l'air ridiculement stupide - cela ne fonctionne pas non plus. J'ai aussi essayé JOIN. Cela semble être quelque chose qui se produirait beaucoup dans le codage WP, mais j'ai cherché et suis arrivé à peu près vide.
Si je comprends bien votre question, cela devrait fonctionner:
function get_event_info($event_id = 0, $info = '' ) {
global $wpdb;
return $wpdb->get_col(
$wpdb->prepare(
"SELECT meta_value from $wpdb->postmeta WHERE
meta_key = '%s' AND post_id IN
(SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = 'event_id' AND meta_value= %s )",
$info, $event_id
)
);
}
Utilisez ceci comme suit:
$names = get_event_info( 19 , 'Name' );
if ( ! empty($names) ) {
echo '<ul>';
foreach ($names as $name) {
echo '<li>' . $name . '</li>';
}
echo '</ul>';
}
Assurez-vous que le deuxième paramètre est exactement le même que meta_key
: dans votre exemple meta_key = 'Name'
, mais la requête SQL est WHERE meta_key='name'
, la casse est différente!
Vous pouvez sélectionner vos publications à l'aide du paramètre meta_query de la classe WP_Query . Obtenez tous les ID de publication des publications qui ont un event_id partagé de 19.
Vous pouvez utiliser les identifiants plus tard pour obtenir toutes les données nécessaires.
J'ai trébuché dans le même problème et obtenir plus ou moins ce que je voulais de cette façon:
SELECT t.post_id, t.meta_value, u.meta_value
FROM `wp_postmeta` t INNER JOIN `wp_postmeta` u
ON t.post_id = u.post_id
WHERE
u.meta_key = 'first_key' AND
t.meta_key = 'second_key'