У мене була подібна проблема нещодавно, мені потрібно було отримати 7 фрагментів метаданих від користувальницького типу публікації, але також потрібно було отримати публікацію на основі фрагмента метаданих.
Тому я створив наступний оператор SQL, використовую його часто. Сподіваємось, це допоможе комусь іншому. Я спробую пояснити це якнайкраще.
global $wpdb;
$pt = 'clients';
$mk = 'trainerid';
$mv = $pid;
$mk1 = 'email';
$mk2 = 'phone';
$mk3 = 'gender';
$mk4 = 'dob';
$mk5 = 'photo';
$mk6 = 'registrationts';
$mk7 = 'activationts';
$ord = 'p.post_name ASC';
$sql = "
SELECT p.ID, p.post_title AS fullname, pm1.meta_value AS email, pm2.meta_value AS phone, pm3.meta_value AS gender, pm4.meta_value AS dob, pm5.meta_value AS photo, pm6.meta_value AS regts, pm7.meta_value AS actemailts
FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID
AND pm.meta_key = '{$mk}'
LEFT JOIN {$wpdb->postmeta} pm1 ON pm1.post_id = p.ID
AND pm1.meta_key = '{$mk1}'
LEFT JOIN {$wpdb->postmeta} pm2 ON pm2.post_id = p.ID
AND pm2.meta_key = '{$mk2}'
LEFT JOIN {$wpdb->postmeta} pm3 ON pm3.post_id = p.ID
AND pm3.meta_key = '{$mk3}'
LEFT JOIN {$wpdb->postmeta} pm4 ON pm4.post_id = p.ID
AND pm4.meta_key = '{$mk4}'
LEFT JOIN {$wpdb->postmeta} pm5 ON pm5.post_id = p.ID
AND pm5.meta_key = '{$mk5}'
LEFT JOIN {$wpdb->postmeta} pm6 ON pm6.post_id = p.ID
AND pm6.meta_key = '{$mk6}'
LEFT JOIN {$wpdb->postmeta} pm7 ON pm7.post_id = p.ID
AND pm7.meta_key = '{$mk7}'
WHERE pm.meta_value = '{$mv}'
AND p.post_type = '{$pt}'
AND p.post_status NOT IN ('draft','auto-draft')
ORDER BY {$ord}
";
$clients = $wpdb->get_results( $wpdb->prepare( $sql ), OBJECT );
Спочатку я отримую функції бази даних wordpress із глобальним $ wpdb. Потім я встановив посттип $ pt. Щоб отримати правильну публікацію, яка відповідає конкретному значенню в post_meta, я встановив $ mk (meta_key)
Тоді я встановлюю var $ mv (meta_value) var. (у цьому випадку мета-значення відповідає postid)
$ mk1- $ mk7 - це мета-ключі, які я хочу від кожної публікації. (Я захоплюю значення у операторі select)
Я також роблю вар. "Порядок", встановивши $ ord
Оператор select виглядає наступним чином: я вибираю ідентифікатор публікації та post_title з POST або «p».
Потім я вибираю всі метадані, потрібні для їх вибору, з pm1. -> pm.7 і захоплення мета_значення та перейменування їх (AS), щоб воно було більш читабельним при отриманні даних з мого об’єкта.
Я створюю СПІЛЬНИЙ ПРИЄДНАЙТЕ для метаданих, які мені потрібні, щоб відповідати публікації. (вечора)
Я створюю 7 лівих з'єднань для кожної з метаданих, які мені потрібно отримати. (pm1-pm7)
Заява WHERE заснована на першому лівому приєднанні (pm), щоб він знав, що мені потрібні лише пости, де метадані відповідають.
Я також додаю "І" для типу публікації та для post_statuses, які не є чернетками. (так тільки опубліковані повідомлення)
Нарешті я додаю пункт "порядок за".
Це працює швидко та із вбудованими індексами в Wordpress, тому здається ефективним.
Не знаю, чи щось краще, ніж це, але якщо воно є, я б хотів це використати.
Сподіваюсь, це допомагає.
Маркус
get_post_meta
окремі клавіші; 2) запустити,get_post_custom
щоб отримати всі користувацькі поля за один кадр, або 3) створити власний запит, використовуючи клас $ wpdb (get_results()
) для створення власного об'єкта повернення . (Документація по класу $ wpdb: codex.wordpress.org/Class_Reference/wpdb )