get_post_meta в WP_Query

Я делаю плагин, чтобы добавлять понравятся сообщения

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

function my_plugin_options() { echo '<p>Table of Likes</p>'; echo '</div>'; echo '<table>'; echo '<tr>'; echo '<td>Post</td>'; echo '<td>Number of likes</td>'; echo '</tr>'; // -- WP_Query -- $like_args = array( 'post_type' => 'post', 'order' => 'DES', 'post_status' => 'publish' ); $like_loop = new WP_Query($like_args); if($like_loop->have_posts()): while($like_loop->have_posts()): $like_loop->the_post(); // -- WP_Query -- $likes = get_post_meta( $like_loop->post_ID, "_like_amount", true); echo '<tr>'; echo '<td>'; the_title(); echo '</td>'; echo '<td>'; $likes; echo '</td>'; echo '</tr>'; endwhile; endif; wp_reset_postdata(); echo '</table>'; } 

У меня есть мета-поле в каждом столбце «_like_amount», это количество понравившихся.

Как использовать get_post_meta для извлечения мета-поля в моем цикле WP_Query ?

я пробовал

 $likes = get_post_meta( $like_loop->post_ID, "_like_amount", true); 

Но это не удается

Solutions Collecting From Web of "get_post_meta в WP_Query"

Оригинальный плакат означает, что это решение:

 global $post; $likes = get_post_meta( $post->ID, "_like_amount", true); 

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

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

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

 function filter_query_add_likes( $clauses, WP_Query $wp_query ) { if ( !is_admin() && !$wp_query->is_main_query() ) { global $wpdb; # Add your wanted meta value in as times_liked $clauses['fields'] .= ', IFNULL( meta_like.meta_value, 0 ) as times_liked '; # Join the postmeta field based on the post id and the key wanted # - this assumes you only have one times_liked meta for each post id! $clauses['join'] .= <<<SQL LEFT JOIN {$wpdb->prefix}postmeta AS meta_like ON meta_like.post_id = {$wpdb->prefix}posts.ID AND meta_like.meta_key = '_like_amount' SQL; } return $clauses; } 

Затем используйте этот фильтр прямо перед тем, как вы запустите свой запрос, чтобы получить свое поле поиска в каждом сообщении.

 function my_plugin_options() { # Same as what you did, just using heredoc echo <<<HTML <p>Table of Likes</p> </div> <table> <tr> <td>Post</td> <td>Number of Likes</td> </tr> HTML; $like_args = array( 'post_type' => 'post', 'order' => 'DES', 'post_status' => 'publish' ); # Set our new filter query to apply for this query add_filter('posts_clauses', 'filter_query_add_likes', 10, 2); $like_loop = new WP_Query( $like_args ); # Remove our filter query to avoid touching other queries on accident remove_filter('posts_clauses', 'filter_query_add_likes', 10, 2); if ( $like_loop->have_posts() ) { while ( $like_loop->have_posts() ) { # using next_post like this pulls your posts out for easy access $current_post = $like_loop->next_post(); # your times_like (from the filter) can now be accessed without # having to do an extra query with get_post_meta() $likes = $current_post->times_liked; # your title can be pulled right in if wanted $title = $current_post->post_title; # Draw your column echo <<<HTML <tr> <td>{$title}</td> <td>{$likes}</td> </tr> HTML; } } # End the table echo "\r\n</table>"; } 

Это делает пару вещей:

  • Теперь вы используете только один запрос, чтобы получить все результаты, которые вы хотите показать
  • Вы можете легко вытащить все, что хотите, из объекта post, включая количество раз, когда сообщение было понравилось.
  • Если в сообщении нет комментариев, он получит 0 из-за вызова ISNULL, сделанного при редактировании предложения полей.

В целом, гораздо быстрее, чем использование get_post_meta, особенно если вы имеете дело с большим количеством сообщений.

Как только ваш пробег $like_loop->the_post() глобальная переменная $post будет установлена ​​на текущую запись в Loop, так что вы хотите:

 $likes = get_post_meta( $post->ID, "_like_amount", true); 

Или…

 $likes = get_post_meta( get_the_ID(), "_like_amount", true); 

… который в некоторых случаях является более устойчивым.

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