Подсчитайте, сколько записей имеют настраиваемый набор полей
Я добавил в свои шаблоны некоторый код, который автоматически добавляет пользовательские поля для кэширования некоторых данных, которые извлекает каждое сообщение. Есть ли способ, которым я могу отслеживать, сколько сообщений было настроено в этом пользовательском поле?
2 answers
Вы можете запустить пользовательский запрос для подсчета количества сообщений с заданным ключом, используя $wpdb
или, более конкретно, используя get_var()
. Если я предполагаю, что вы хотите подсчитать опубликованные сообщения с заданным ключом, то это должно сделать что-то вроде следующего.. (хотя это всего лишь пример).
function get_meta_count( $key = '', $type = 'post', $status = 'publish' ) {
global $wpdb;
// Example code only
// Good idea to add your own arg checking here
if( empty( $key ) )
return;
$r = $wpdb->get_var( $wpdb->prepare( "
SELECT COUNT(*) as count FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
", $key, $status, $type ) );
return $r;
}
Повторите или сохраните возвращенное значение по мере необходимости. Если вы собираетесь передавать какие-либо данные, которые были запрошены или отправлены пользователем, вам потребуется добавить дополнительную проверку данных внутри функция.
ПРИМЕЧАНИЕ: Если вы делаете это, рассчитывая на страницу администратора, то вместо этого вы можете использовать внутреннюю функцию (я не могу вспомнить, какую конкретно сейчас, но я посмотрю ее, если вам нужно что-то на стороне администратора).
Надеюсь, что это поможет в любом случае.
Дополнение: Мне было любопытно после публикации Viper, чтобы узнать, насколько велика будет разница между двумя запросами, поэтому я сделал каждый звонок по 5 раз и записал время..
$wdbb->get_var
Script Execution Time: 0.004 seconds
Script Execution Time: 0.004 seconds
Script Execution Time: 0.004 seconds
Script Execution Time: 0.004 seconds
Script Execution Time: 0.004 seconds
// Yes i realise the results are all the same above, that's how they came out
get_posts()
Script Execution Time: 0.035 seconds
Script Execution Time: 0.04 seconds
Script Execution Time: 0.03 seconds
Script Execution Time: 0.027 seconds
Script Execution Time: 0.04 seconds
Я бы обратите внимание, что когда get_posts
получил метаключ, который он не смог найти, то он дал результаты намного ближе к скорости $wpdb
, но все равно не дотянул, оставив метод $wpdb
по крайней мере в 2 раза быстрее каждый раз.
Думаете, мои результаты ошибочны? Пожалуйста, выполните свои собственные тесты, и если вам нужна копия кода, который я использовал, вы можете найти его в форме "голые кости" здесь.
У Viper действительно есть обоснованная точка зрения (будущая проверка всегда хороша), я просто хотел показать, что есть некоторые измеримые различия между этими двумя методами (и если кто-то видит проблему с моим подходом, пожалуйста, не стесняйтесь, дайте мне знать).
Я бы рекомендовал использовать get_posts(). Он будет использовать больше памяти, чем прямой запрос к базе данных, так как он будет возвращать полные объекты post, но у него есть преимущество в том, что он, по сути, является будущим доказательством, поскольку вы используете API.
$meta_posts = get_posts( 'meta_key=foobar' );
$meta_post_count = count( $meta_posts );
unset( $meta_posts);
Смотрите документы query_posts() для получения полного списка аргументов, которые вы можете использовать, и тонны отличных примеров.