Вопрос или проблема
У меня есть значение, которое я пытаюсь сохранить как метаданные пользователя для авторов на моем сайте. Мне нужно, чтобы оно обновлялось каждый раз, когда производится просмотр содержания поста для этого автора. Вот что у меня получилось, но значение не сохраняется. Я использую это в functions.php.
function user_score() {
global $bp;
$author_id = $bp->displayed_user->id; // делаем что-то, чтобы получить ID пользователя
$author_posts = get_posts( array(
'author' => $author_id,
'posts_per_page' => -1
) );
$counter = 0;
foreach ( $author_posts as $post )
{
$score = get_post_meta( $post->ID, 'ratings_score', true );
$counter += $score;
}
update_user_meta( $author_id, 'user_score', $counter );
if ($echo)
echo $counter;
return $counter;
}
add_filter('the_content','update_user_score');
function update_user_score($content){
global $post;
user_score();
return $content;
}
Не протестировано, но должно работать
add_filter('the_content','update_user_score');
function update_user_score($content){
global $post;
$counter = 0;
$score = get_post_meta( $post->ID, 'ratings_score', true );
$counter += $score;
update_user_meta( $post->post_author, 'user_score', $counter);
return $content;
}
Я бы использовал действие wp_footer
. Вы можете сделать что-то подобное ниже. Вам не нужно проходить через все посты каждый раз, когда отображается пост. Просто добавьте текущий балл поста к пользователю для текущего поста.
add_action('wp_footer', 'wpse55725_update_user_score');
function wpse55725_update_user_score(){
if( !is_singular('post') )
return; // выполняйте только для одиночного поста
global $post;
$current_score = get_user_meta( $post->post_author, 'user_score', true ); // получить текущий балл пользователя
$score_points = get_post_meta( $post->ID, 'ratings_score', true ); // балл для поста
$score = $current_score + $score_points; // добавляем балл к текущему баллу пользователя
update_user_meta( $post->post_author, 'user_score', $score); // сохранить
}
Код не протестирован.
Ответ или решение
Чтобы обновить пользовательские метаданные автора при просмотре содержимого поста, важно эффективно организовать код и использовать подходящие хуки WordPress. Ниже представлено решение, которое оптимально обновляет метаданные пользователя для авторов, не перегружая производительность сайта.
Подход к решению
Для конкретной задачи — обновления пользовательской метаинформации автора на основе его постов — вам следует использовать хуки, которые вызываются при рендеринге поста. Вместо того чтобы перебирать все посты автора, мы можем просто добавить значение текущего поста к существующему значению метаданных автора.
Пример реализации
Вместо вложенной функции и лишних циклов, рассмотрим следующий код, который выполняет задачу более эффективно:
add_action('wp_footer', 'update_user_score_on_post_view');
function update_user_score_on_post_view() {
if (!is_singular('post')) {
return; // Прекращаем выполнение, если это не единичный пост
}
global $post;
// Получаем текущую оценку пользователя
$current_score = get_user_meta($post->post_author, 'user_score', true) ?: 0;
// Получаем оценку текущего поста
$post_score = get_post_meta($post->ID, 'ratings_score', true) ?: 0;
// Обновляем общую оценку пользователя
$updated_score = $current_score + $post_score;
// Сохраняем обновленное значение метаданных пользователя
update_user_meta($post->post_author, 'user_score', $updated_score);
}
Подробное объяснение кода
-
Хук wp_footer: Мы используем этот хук, так как он срабатывает в конце загрузки страницы, что позволяет нам быть уверенными, что всё содержимое поста было загружено.
-
Проверка is_singular: Функция
is_singular('post')
позволяет убедиться, что код вызывается только на страницах отдельных постов, что помогает избежать лишних операций при загрузке других типов контента. -
Получение текущих значений: Мы получаем текущий счёт автора и счёт поста с использованием
get_user_meta
иget_post_meta
. Если значение отсутствует, используется нулевое значение. -
Обновление пользовательских метаданных: С помощью
update_user_meta
, мы сохраняем новое значение счёта. Это позволяет аккумулировать значения без необходимости повторной обработки всех постов автора.
Заключение
Используя приведённый выше код, вы сможете эффективно обновлять пользовательские метаданные автора при каждом просмотре его поста. Это решение не только упрощает процесс, но и сохраняет ресурсы вашего сервера, уменьшив затраты на выполнение лишних операций. Рекомендуется протестировать код на локальном окружении перед развертыванием на производственном сайте, чтобы убедиться в его корректной работе в вашем конкретном случае.