Подсчитайте, сколько записей имеют настраиваемый набор полей


Я добавил в свои шаблоны некоторый код, который автоматически добавляет пользовательские поля для кэширования некоторых данных, которые извлекает каждое сообщение. Есть ли способ, которым я могу отслеживать, сколько сообщений было настроено в этом пользовательском поле?

Author: quis, 2011-02-21

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 действительно есть обоснованная точка зрения (будущая проверка всегда хороша), я просто хотел показать, что есть некоторые измеримые различия между этими двумя методами (и если кто-то видит проблему с моим подходом, пожалуйста, не стесняйтесь, дайте мне знать).

 2
Author: t31os, 2011-02-22 00:11:18

Я бы рекомендовал использовать get_posts(). Он будет использовать больше памяти, чем прямой запрос к базе данных, так как он будет возвращать полные объекты post, но у него есть преимущество в том, что он, по сути, является будущим доказательством, поскольку вы используете API.

$meta_posts = get_posts( 'meta_key=foobar' );
$meta_post_count = count( $meta_posts );
unset( $meta_posts);

Смотрите документы query_posts() для получения полного списка аргументов, которые вы можете использовать, и тонны отличных примеров.

 1
Author: Viper007Bond, 2011-02-21 20:20:13