Вопрос или проблема
Я пытаюсь посчитать, сколько мета-ключей существует в записи, потому что каждый раз, когда происходит определенное действие пользователя, создается новый мета-ключ с датой в нем.
У меня есть это, что не возвращает ничего (я ищу число)…
...
$post_title = $row->post_title;
$id = $row->ID;
$post_count = $wpdb->get_var("
SELECT COUNT(DISTINCT $wpdb->postmeta.meta_key) FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta
WHERE $wpdb->posts.post_type="things"
AND $wpdb->postmeta.meta_key = 'dates'
AND post_id = $id
");
echo $post_title . ' (' . $post_count . ')' . "\n";
}
Также я хотел бы посчитать общее количество мета-ключей, связанных с пользовательским постом, любая помощь по этим вопросам будет非常 признательна!
У вас есть структурная проблема с вашими данными. Сериализованные данные в базе данных ужасны, если вам нужно искать по частям этих сериализованных данных.
Нет надежного, эффективного и, безусловно, простого SQL-запроса для поиска по сериализованным данным. “Сериализация” – это механизм PHP. Это не SQL. Для базы данных это просто строка. Ваш единственный выбор SQL – это регулярное выражение по строке.
WP_Query, безусловно, не справится с этим. Эта функциональность не встроена, вероятно, по указанной выше причине.
Итерация по данным – это единственное решение, которое у вас есть, учитывая структуру данных, с которой вы работаете.
Тем не менее, правильным решением, на мой взгляд, является изменение вашей структуры данных так, чтобы вы сохраняли детализированные части данных в базе данных. Другими словами, используйте множество различных ключей для значений, которые вам нужно искать.
Вы можете просто сделать: count( get_post_custom_keys($pid) )
Я решил эту проблему с некоторыми пробами и ошибками:
Это дало мне количество пост-мета с правильным id,
...
$post_title = $row->post_title;
$id = $row->ID;
$post_count = $wpdb->get_var("
SELECT COUNT(*) FROM $wpdb->postmeta
WHERE post_id = $id
Ответ или решение
Для задачи по подсчету количества идентичных мета-ключей в записях WordPress, я предлагаю оптимальное решение. Ваша первоначальная версия SQL-запроса содержит несколько неточностей, которые мешают получить нужные результаты.
Если вам нужно подсчитать, сколько раз мета-ключ ‘dates’ встречается у определенной записи, вы можете использовать следующий код:
$post_title = $row->post_title;
$id = $row->ID;
$post_count = $wpdb->get_var("
SELECT COUNT(*) FROM $wpdb->postmeta
WHERE post_id = $id
AND meta_key = 'dates'
");
echo $post_title . ' (' . $post_count . ')' . "\n";
Такой запрос правильно выбирает количество записей из таблицы postmeta
, где post_id
соответствует идентификатору вашей записи, а meta_key
равен ‘dates’. Это позволяет вам получить точное количество всех мета-ключей ‘dates’, связанных с данной записью.
Если вам нужно посчитать общее количество всех мета-ключей, связанных с заданным типом поста, вы можете использовать следующий запрос:
$post_count = $wpdb->get_var("
SELECT COUNT(*) FROM $wpdb->postmeta
WHERE post_id IN (SELECT ID FROM $wpdb->posts WHERE post_type = 'things')
");
Этот запрос предоставляет общее количество мета-ключей для всех записей с типом ‘things’. Он использует подзапрос для получения идентификаторов всех записей выбранного типа.
Важно отметить, что структура данных в WordPress использует сериализацию, что может затруднять выполнение запросов для определенных случаев. Поэтому, если у вас есть возможность, настоятельно рекомендуется использовать более развернутые наборы данных с различными мета-ключами для каждого значения. Это значительно упростит процесс поиска и анализа данных.
Если у вас возникнут дополнительные вопросы или потребуется помощь с другими задачами, не стесняйтесь обращаться.