quis
  • 0
Новичок

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

  • 0

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

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

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

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

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

    • 0

Оставить ответ

You must login to add an answer.