2014-01-15 6 views
0

Я начинаю разрабатывать портал Worpdress с примерно 5000 пользователями. Каждый из пользователей будет иметь около 20 метазначений (например, улица, город и т. Д.).Wordpress users meta management

Мне нужно будет сделать несколько отчетов с разбивкой по страницам/сортировкой по метаданным пользователей, и мне любопытно, какой будет наиболее эффективный подход.

Wordpress обычно хранит каждый мета в usermeta таблице, так что я мог бы либо:

1) join the users and usermeta table multiple times, чтобы получить все метаданные и сортировки в запросе MYSQL непосредственно

2) использовать get_users(array('fields' => 'all_with_meta')); и пользовательские сортировки функция, как описано здесь http://www.stormconsultancy.co.uk/blog/development/code-snippets/sort-a-list-of-wordpress-users-by-a-custom-meta-field/

3) создать custom meta table для хранения значений - описано здесь http://sltaylor.co.uk/blog/custom-meta-tables-wordpress/

что бы лучший подход? Или есть ли другие способы работы с пользователями и их метаданные в Wordpress?

ответ

0

Вчера у меня был similar question для системы, которая ищет определенные пометки полей для ключевых слов.

Ответ на указанную выше ссылку вернет сообщение, если какое-либо из полей содержит поисковый запрос.

Однако улучшенная версия ниже возвращает , сколько из ключевых слов было найдено (от 0 до # ключевых слов, а не фактическое количество ключевых слов найдено в каждом поле).

Таблицы мета и пользователя FYI Met в основном одинаковы, это должно работать на вас. Возможно, вы сможете установить это с помощью объекта запроса wordpress, однако мой код является обычным SQL, поскольку он является автономным скриптом - вне WordPress.

SELECT * 

FROM (
    SELECT 
    post.ID as post_id, 

    (IF ((
     post.post_title LIKE '%c++%' 
     OR post.post_content LIKE '%c++%' 
     OR meta_field_a.meta_value LIKE '%c++%' 
     OR meta_field_b.meta_value LIKE '%c++%' 
    ), 1, 0) 
    + IF ((
     post.post_title LIKE '%java%' 
     OR post.post_content LIKE '%java%' 
     OR meta_field_a.meta_value LIKE '%java%' 
     OR meta_field_b.meta_value LIKE '%java%' 
    ), 1, 0)) AS occurrences 

    FROM wp_posts post 

    JOIN wp_postmeta meta_field_a ON (meta_field_a.post_id = post.ID AND meta_field_a.meta_key = 'field_a') 
    JOIN wp_postmeta meta_field_b ON (meta_field_b.post_id = post.ID AND meta_field_b.meta_key = 'field_b') 

    WHERE post.ID IN (212, 213, 214) 

    GROUP BY post.ID 
) AS results 

WHERE results.occurrences > 0 

«если» заявление блоки проверки по ключевому слову, и возвращает 1 или 0, если они будут найдены или не найдены (в любой области). Это добавляется вместе для создания «вхождений», которое возвращается в строке.

Блок оператора «JOIN» вытаскивает только одну метку по имени ключа. Каждый мета-ключ нуждается в собственном соединении, но, по-видимому, это не дорогостоящая операция.

Оператор «WHERE» ограничивает фильтр указанными идентификаторами сообщений. Они поступают из внешней функции, но вы можете заменить ее собственной инструкцией, чтобы проверить тип/статус сообщения вручную. Так как вы имеете дело с пользователями, вы, вероятно, вообще не хотите, чтобы WHERE там (или, возможно, вам нужно проверить другую мета-пользователя, например роль).

+0

Спасибо, я закончил использовать JOINS также ... – user1049961

Смежные вопросы