Intereting Posts
как добавить класс css в ящики продукта li, для img, добавить кнопку корзины, decs, price … Как go дать значение $ wp_query single.php игнорируется, переходя прямо к attachment.php Как фильтровать архивы как по категориям, так и по тегам? Несколько типов сообщений для плагина BuddyBlog Попытка выяснить, почему моя дочерняя тема пытается получить доступ к файлу, который не существует Настройка URL-адреса входа в WordPress где я могу найти страницу входа в WordPress и добавить в нее свой заголовок Санитарная обработка данных для регистрации пользователя и входа пользователя Пропуск первых 3 сообщений в запросе wp Плагин не подготовлен для локализации Как использовать массив в функции, чтобы получить только значение, которое я хочу Возрастание ордера игнорируется в мета-запросе? Как подсчитать количество архивов Проблема создания пользовательской функции санитизации для раскрывающегося списка пользователей

Как я могу запросить сообщения с помощью частичного мета-ключа?

У меня есть функция, которая хранит статус «как» для сообщения в качестве сообщения мета. Я хочу связать это «как» с пользователем, которому это понравилось, поэтому я настраиваю настраиваемое поле «like_status_ {user_id]» (где {user_id] – это идентификатор текущего пользователя, который я хранил как 0 или 1. Итак, для сообщения с несколькими «симпатичными» в db будет несколько метаданных, которые настраиваются следующим образом:

'meta_key' = 'like_status_0' 'meta_value' = 1 'meta_key' = 'like_status_2' 'meta_value' = 1 'meta_key' = 'like_status_34' 'meta_value' = 1 

….и так далее.

На определенном посту есть потенциально тысячи людей. Как я могу запустить запрос, который показал, понравился ли кому-то еще этот пост?

Я думал примерно так:

 $query = new WP_Query(array( 'meta_key' => 'like_status_{user_id}', 'meta_value' => 1, )); 

Я пытаюсь подтолкнуть уведомление всем, кому понравилось сообщение, когда кому-то нравится этот пост … что-то вроде: «Эй, кому-то понравился этот пост, который вам понравился. Вы должны пойти проверить!» Но мне нужен способ узнать, понравился ли кому-нибудь другой этот пост, и если да, то кто они будут, я мог бы уведомить их.

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

К сожалению, вы не можете выполнить meta_query используя сравнение LIKE в значении meta_key при использовании WP_Query . Я был на этом пути …

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

Опция 1

  • не требует модификации вашей мета-схемы
  • использует класс wpdb для выполнения пользовательского запроса

Пример:

 //when a user likes a post... $current_user_id = get_current_user_id(); add_post_meta($current_user_id, "like_status_{$current_user_id}", 1, false); //later in the request... global $wpdb; $results = $wpdb->get_results( " SELECT meta_key FROM {$wpdb->prefix}postmeta WHERE meta_key LIKE 'like_status_%' ", ARRAY_N ); $results = array_map(function($value){ return (int) str_replace('like_status_', '', $value[0]); }, $results); array_walk($results, function($notify_user_id, $key){ //apply to all users except the user who just liked the post if ( $notify_user_id !== $current_user_id ) { //notify logic here... } }); 

Примечание: логика может быть упрощена, если хотите.

Вариант 2

  • требует изменения вашей мета-схемы
  • требует сохранения идентификатора пользователя в качестве метазначения
  • позволяет использовать WP_Query вместе с meta_query

Вариант 2 требует, чтобы вы изменили свой мета-ключ от like_status_{user_id} до чего-то универсального, такого как like_status или liked_by_user_id где вместо того, чтобы хранить значение 1 против ключа, вместо этого вы сохраняете идентификатор пользователя в качестве значения.

 //when a user likes a post... $current_user_id = get_current_user_id(); add_post_meta($current_user_id, "liked_by_user_id", $current_user_id, false); //later in the request $args = array( 'post_type' => 'post', //or a post type of your choosing 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'liked_by_user_id', 'value' => 0, 'type' => 'numeric' 'compare' => '>' ) ) ); $query = new WP_Query($args); array_walk($query->posts, function($post, $key){ $user_ids = get_post_meta($post->ID, 'liked_by_user_id'); array_walk($user_ids, function($notify_user_id, $key){ //notify all users except the user who just like the post if ( $notify_user_id !== $current_user_id ) { //notify logic here... //get user eg $user = get_user_by('id', $notify_user_id); } }); }); 

Трудно конкретно ответить на ваш вопрос. Первая часть легко. Недавно я сделал что-то подобное в stackoverflow

Мета-ключи сравниваются и точно совпадают. WP_Query не имеет возможности настроить это поведение с помощью простого параметра, но мы всегда можем ввести его сами, а затем posts_where предложение posts_where , чтобы сделать сравнение LIKE на мета-ключах.

ФИЛЬТР

Это всего лишь базовый фильтр, при необходимости отрегулируйте его.

 add_filter( 'posts_where', function ( $where, \WP_Query $q ) { // Check for our custom query var if ( true !== $q->get( 'wildcard_on_key' ) ) return $where; // Lets filter the clause $where = str_replace( 'meta_key =', 'meta_key LIKE', $where ); return $where; }, 10, 2 ); 

Как вы можете видеть, фильтр запускается только при установке нашего нового настраиваемого параметра wildcard_on_key в значение true . Когда это проверяется, мы просто меняем = компаратор на компаратор LIKE

Просто примечание об этом, сравнение LIKE по своей природе более дорогое, чтобы выполнить другие сравнения

ВОПРОС

Вы можете просто запросить свои сообщения, как like_status_{user_id} чтобы получить все сообщения с мета-ключами like_status_{user_id}

 $args = [ 'wildcard_on_key' => true, 'meta_query' => [ [ 'key' => 'like_status_', 'value' => 1, ] ] ]; $query = new WP_Query( $args ); 

ДРУГОЙ ВОПРОС

Пользовательские поля не влияют на производительность, вы можете прочитать мой пост по этому вопросу здесь . Меня, однако, беспокоит то, что вы говорите, что каждый пост может иметь сотни или тысячи понравившихся. Это может поразить вас при получении и кэшировании такого большого количества настраиваемых полевых данных. Он также может забивать ваш db огромным количеством ненужных пользовательских полевых данных, что затрудняет его поддержку.

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

Обновление настраиваемого поля также легко. Для этого вам нужно будет изучить update_post_meta() , я не знаю, как вы создаете свои настраиваемые поля, но update_post_meta() – это то, что вы хотели бы использовать.

Если вам нужно отправить электронную почту или нажать уведомления, когда настраиваемое поле будет обновлено, у вас есть следующие крючки, доступные для работы. ( См. update_metadata() для контекста )

  • update_postmeta

  • обновлено _ {$ meta_type} _meta

  • updated_postmeta

  • обновить _ {$ meta_type} _meta

  • обновление _ {$ meta_type} _metadata

ВЫВОД

Как раз перед тем, как я опубликую это снова, прежде чем идти по сериализованному маршруту, убедитесь, что вам не нужно сортировать по отсортированным данным или искать конкретные данные внутри сериализованных данных.

Если позже вы хотите расширить это, с более подробной статистикой, функциями и т. Д., То другой альтернативой может быть: пользовательская таблица (таблицы)

  • профи : настраивается под ваши нужды и может быть проиндексирован для повышения производительности.

  • минусов : Больше работы

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

Я пытаюсь подтолкнуть уведомление всем, кому понравилось сообщение, когда кому-то нравится этот пост … что-то вроде: «Эй, кому-то понравился этот пост, который вам понравился. Вы должны пойти проверить!» Но мне нужен способ узнать, понравился ли кому-нибудь другой этот пост, и если да, то кто они будут, я мог бы уведомить их.

Не знаете, какие уведомления вы имеете в виду здесь, но это может быстро стать громоздким.

Пример : пользователь, который любит ~ 1000 сообщений и каждый пост получает ~ 1000 нравится, то есть 1M-уведомления в трубах, только для этого пользователя! Если это уведомления по электронной почте, поставщик хоста может не понравиться, и пользователь сойдет с ума. Это также может быть дорогостоящим при использовании сторонней электронной почты.

В документации WP_Meta_Query вы можете использовать аргумент meta_query аргументе meta_query WP_Query. Однако вы можете сравнивать только value а не key чтобы вы могли подумать, как вы его структурируете.

like аргумент будет выглядеть так:

 $arguments = array( 'meta_query' => array( array( 'key' => 'foo', 'value' => 'ba', 'compare' => 'LIKE' ) ) ); $query = new WP_Query($arguments); 

Учитывая, что вы не можете выполнять поиск «LIKE» по key я предлагаю вам добавить понравившиеся сообщения в метате пользователя и выполнить поиск WP_User_Query для пользователей, которым понравилось это сообщение:

 $arguments = array( 'meta_query' => array( array( 'key' => 'liked_post', 'value' => '<post_id>' ) ) ); $users = new WP_User_Query($arguments);