Я хотел бы создать wp_query, который возвращал бы мета сообщений внутри posts
массива.
$args = array (
'post_type' => 'page',
'meta_key' => 'someMetaKeyName',
);
// The Query
$query = new WP_Query( $args );
Это возвращает что-то вроде:
Как вы можете видеть, посты не имеют метаданных, возможно ли включить метаданные в возвращаемый массив?
PS Я не хочу дополнительные wp_queries по соображениям производительности.
wp-query
custom-field
post-meta
YemSalat
источник
источник
get_post_meta
на отдельных ключах, 2) запускать,get_post_custom
чтобы получить все настраиваемые поля сообщений за один снимок, или 3) создавать свой собственный запрос, используя класс $ wpdb (get_results()
) для создания собственного возвращаемого объекта. , (Документация по классу $ wpdb: codex.wordpress.org/Class_Reference/wpdb )Ответы:
По умолчанию
WP_Query
возвращает стандартныеWP_Post
объекты для запрашиваемых сообщений. Я полагаю, что при некотором умном переписывании и использовании приведенных фильтровWP_Query
вы можете добавлять объекты вWP_Post
массив возвращаемых объектов.Это будет исполнительским? На мой взгляд, это приведет к снижению производительности, поскольку вам нужно будет объединить результаты в запросе, поскольку настраиваемые поля сохраняются не в
wp_posts
таблице, а вwp_postmeta
таблице.Получение метаданных поста действительно быстро и не требует дополнительного экземпляра
WP_Query
. Вы можете просто вызвать пользовательское поле с помощьюget_post_meta()
. WordPress был очень вдумчивым, когда были введены пользовательские поля. Они добавили кеш для кеширования, так что, если вы запрашиваете 1 или 100 пользовательских полей, вы попадаете в базу данных один раз, сверхбыстрый. Для полного теста и объяснения, см. Этот пост, который я недавно сделал на эту тему.На мой взгляд, дополнительный вызов базы данных и фактическое затраченное время стоят того и быстрее, чем перезапись
WP_Query
таким образом, чтобы включить настраиваемые поля в стандартный объект post, возвращаемый$posts
источник
get_post_meta()
для каждого поста ... Я бы предпочел, чтобы был способ сохранить дополнительные данные либо непосредственно вwp_posts
таблице, либо в связанная таблица, которая не так уж и важна, какwp_postsmeta
есть.get_post_meta()
или это как объект сообщения, вам нужно будет вызывать его в каждом сообщении. То же самое относится и к шаблонным тегам, напримерthe_content()
, вы должны вызывать это в каждом сообщении.Этому вопросу более 1 года, но у меня тот же пробломлем, и вот функция, которая будет добавлять каждое meta_value и meta_key к объекту $ wp_query,
вместо запроса каждой мета-записи в цикле while эта функция выполнит один дополнительный пример запроса:
«ВЫБЕРИТЕ meta_key, meta_value, post_id FROM $ wpdb-> postmeta ГДЕ post_id IN (1,2,3,4,5 ...)»
где (1, 2, 3, 4, 5 ...) - это идентификаторы сообщений из $ wp_query
Дополнительная запись "postmeta" будет записана в каждый $ wp_query-> posts [$ i]
$wp_query->posts[0]->postmeta
Пример с 'someMetaKeyName' не забудьте поставить
add_query_meta()
к вашей теме functin.phpисточник
Недавно у меня была похожая проблема, мне нужно было получить 7 фрагментов метаданных из пользовательского типа записи, но мне также нужно было получить запись на основе фрагмента метаданных.
Поэтому я создал следующий оператор SQL, я часто его использую. Надеюсь, это поможет кому-то еще. Я постараюсь объяснить это как могу.
Сначала я получаю функции базы данных 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, так что это кажется эффективным.
Не знаю, если что-то лучше, чем это, но если это так, я хотел бы использовать это.
Надеюсь это поможет.
Маркус
источник
Эй, пожалуйста, попробуйте этот, я думаю, что он работает нормально.
источник
meta_key
иmeta_query[]['key']
так же?meta_key
и / илиmeta_query
не изменять тип возвращаемых результатов, только сам запрос.