Добавление настраиваемого поля для публикации объекта из пользовательской таблицы

Я пишу счетчик плагина для WordPress, который будет отслеживать ежедневные и тотальные представления.

Обычно вы должны использовать почтовые метаполя для хранения такой информации. Но я не могу:

Я не могу использовать мета-поля, потому что мета-поля не могут быть обновлены без риска потери предыдущих значений (без блокировки). Например:

Мета-поле «dviews» имеет значение 10. Приходит запрос №1, он будет извлекать поле и вызывать update_meta с помощью $ oldValue + 1 (= 11). Это будет работать в мире, где может возникнуть только один запрос. Но в реальном мире существует несколько одновременных запросов. Поэтому, когда рабочий из запроса № 1 сохраняет «11 просмотров», другие запросы могли бы уже увеличить значение до 17. Результат: рабочий из запроса №1 установит статистику на 11 – я потеряю 7 просмотров. На спокойном занятом месте это может быть реальной проблемой.

Решение. Я создал другую таблицу « views » с двумя полями: post_id и dviews.

Теперь я могу запустить инструкцию INSERT … ON DUPLICATED KEY UPDATE … *. Это очень мощно, и я сохраняю запрос.

Проблема: теперь я хочу показать представления в панели управления admin (как в столбце edit.php). Я мог бы присоединиться к моим табличным представлениям с помощью таких перехватов, как * pre_get_posts *, * posts_fields * и * posts_joins *, поэтому мои поля доступны в цикле.

Но когда я хочу получить объект post (я использую * get_post *), мои поля отсутствуют, потому что функция не использует сообщения из цикла.

Что я могу сделать?

  • Напишите мою собственную функцию «get_post»?
  • Есть ли другая функция get_post, которую я мог бы использовать?
  • Можно ли полагаться на глобальную переменную $ post, которая будет отображаться?
  • Добавление столбцов в таблицу сообщений WordPress?

Я хочу избежать дополнительных запросов только для статистики. При отображении 100 сообщений в таблице панели, я бы получил дополнительные 100 запросов только для статистики. Нехорошо. Есть ли надежный способ доступа к уже заполненным сообщениям из цикла? Я действительно не понимаю, почему «get_post» не использует эти данные. Может, кто-нибудь может объяснить?

Я также хочу избежать манипуляции с основными таблицами. Но я не уверен, есть ли лучший способ, потому что

function &get_post(&$post, $output = OBJECT, $filter = 'raw') { // [...] if ( ! $_post = wp_cache_get($post_id, 'posts') ) { $_post = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id)); // [...] } // (from wp-includes\post.php) 

запросит кеш и, по крайней мере, запустит свой собственный неперехваченный запрос.

В качестве альтернативы вместо обновления метафила добавьте новый!

Тогда проблема становится, какая мета имеет наибольшее значение, и как мне очистить другие метаполя.

Как я это сделаю

Вместо того, чтобы изобретать колесо, я вижу, что Google уже сделал блестящую работу по подсчету того, сколько людей просматривает страницу. Я также вижу, что Google Analyticator даже показывает мне топ-5 и дает мне график.

Вместо этого используйте API Google или интегрируйте другое существующее решение. Даже статистика wordpress.com и WP отправляет результаты на удаленную машину, а не размещает весь пакет статистики и базу данных локально.

Использование метаданных или параметров, или пользовательской таблицы и т. Д. И т. Д. Замедляет загрузку вашей страницы, значительно увеличивает размер ваших баз данных и создает множество проблем, а не только блокирует таблицы.

Заключительная записка о производительности

Я также признаю, что здесь есть неотъемлемая часть, между скоростью / масштабируемостью и свежей информацией. Если у вас есть счетчик на интерфейсе, который на 100% точнее все время, с ним связаны вычислительные и логистические издержки.

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

MySQL предотвратит конфликты для вас в записях, которые записываются / редактируются. Таким образом, вы действительно можете использовать почтовые метаполя для хранения счетчиков и т. Д. Просто напишите свой собственный запрос, который считывает значение и обновляет его все одновременно.

Пример:

 update wp_postmeta set meta_value = ( (CAST meta_value AS DECIMAL) + 1 ) where meta_key = "my_counter" and post_id = 123 

Что-то вроде того…