Недавно у меня была похожая проблема, мне нужно было получить 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. Затем я установил posttype с помощью $ pt. Чтобы получить правильный пост, который соответствует определенному значению в post_meta, я установил $ mk (meta_key)
Затем я установил переменную $ mv (meta_value). (в этом случае мета-значение соответствует postid)
$ mk1- $ mk7 - мета-ключи, которые я хочу от каждого поста. (Я возьму значения в операторе выбора)
Я также делаю 'order by' var, устанавливая $ ord
Оператор select выглядит следующим образом: я выбираю идентификатор сообщения и post_title из POST или «p».
Затем я выбираю все нужные мне метаданные с помощью pm1. -> pm.7 и захват meta_value и переименование их (AS), чтобы он был более читабельным при извлечении данных из моего объекта.
Я создаю LEFT JOIN для метаданных, которые мне нужно сопоставить с постом. (вечера)
Я создаю 7 левых соединений для каждой метаданной, которую мне нужно получить. (PM1-PM7)
Оператор WHERE основан на первом LEFT JOIN (pm), поэтому он будет знать, что мне нужны только сообщения, для которых совпадают метаданные.
Я также добавляю «И» для типа записи и для post_statuses, которые не являются черновиками. (так только опубликованные посты)
Наконец, я добавляю предложение 'order by'.
Это работает быстро и со встроенными индексами в Wordpress, так что это кажется эффективным.
Не знаю, если что-то лучше, чем это, но если это так, я хотел бы использовать это.
Надеюсь это поможет.
Маркус
get_post_meta
на отдельных ключах, 2) запускать,get_post_custom
чтобы получить все настраиваемые поля сообщений за один снимок, или 3) создавать свой собственный запрос, используя класс $ wpdb (get_results()
) для создания собственного возвращаемого объекта. , (Документация по классу $ wpdb: codex.wordpress.org/Class_Reference/wpdb )