2016-08-18 9 views
0

Я хочу получить самые свежие 5 опубликованных WordPress Сообщений для каждой категории во внешнем приложении. Это приложение создается в ASP.NET, поэтому я хочу получить данные непосредственно из базы данных MySQL с помощью EF. Построение отношений WordPress в EF кажется ужасным, поэтому я хочу создать пользовательскую модель, содержащую сведения о категории и информацию о новейших сообщениях.Получайте последние 5 сообщений в WordPress для каждой категории

Поэтому я написал запрос SQL, который работает, но из-за агрегатного группе он дал мне только одну строку (запись) в категории:

Select terms.term_id As Id, terms.name As Name, terms.slug As SeoName, Group_Concat(relations.object_id) As PostId, taxonomy.count As Count, taxonomy.parent As ParentId, 
(
    Select post_title 
    From wp_posts 
    Where ID In(Group_Concat(relations.object_id)) 
    Order By post_date Desc 
) As PostTitle 
From wp_terms terms, wp_term_taxonomy taxonomy, wp_term_relationships relations 
Where terms.term_id = taxonomy.term_id 
And relations.term_taxonomy_id = taxonomy.term_taxonomy_id 
And taxonomy.taxonomy = 'category' 
Group By terms.term_id 

Моя идея состояла в том, чтобы добавить Having Count(terms.term_id) = 5 так что я получаю 5 строк по категориям. Но он не работает, я получил пустой результат. Без Having я получаю одну строку для каждой категории с новейшим сообщением.

Как я могу сказать MySQL возвращать 5 строк для каждой категории БЕЗ удаления группировки?

Допустим, у меня есть категории дерева:

  • CATA
  • CatB
  • CATC

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

CategoryId | CategoryName | NewestPostTitle 

1   | CatA  | Newest post in CatA 
1   | CatA  | Second newest post in CatA 
... 
2   | CatB  | Newest post in CatB 
2   | CatB  | Second newest post in CatB 
... 
3   | CatC  | Newest post in CatC 
3   | CatC  | Second newest post in CatC 
+0

Если вам нравится, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, предоставьте правильные инструкции CREATE и INSERT (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему , 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. – Strawberry

+0

Почему вы не перебираете категории и не запрашиваете сообщения каждой итерацией простым WP_Query (или get_posts ())? –

ответ

0

Почему вы не используете b uilt в функциях wordpress? Пожалуйста, попробуйте следующий код, я проверил его, и он прекрасно работает для моих тестов:

$categories = get_categories(); 

/* echo '<pre>'; 
print_r($categories); 
echo '</pre>'; */ 

foreach($categories as $category){ 
    $args = array(
     'posts_per_page' => 5, 
     'cat' => $category->term_id, 
     'orderby' => 'ID', 
     'order' => 'DESC' 
    ); 

    $query = new WP_Query($args); 

    echo $category->name . '<hr />'; 

    while($query->have_posts()):$query->the_post(); 
     echo the_title() . '<br />'; 
    endwhile; 
} 

Edit: я не понимаю, что вы хотели, чтобы использовать это во внешнем приложении. Я бы использовал предоставленный мной код и создал шаблон страницы, который вернет результаты в массив или в формате json.

Вы также можете выполнить эхо-запрос, используемый wordpress для захвата данных и его создания. Вы можете сделать это, повторив запрос $ query->;

например.

Grab список WordPress категорий через:

SELECT t.term_id AS id 
FROM wp_terms t 
     LEFT JOIN wp_term_taxonomy tt 
       ON t.term_id = tt.term_id 
WHERE tt.taxonomy = 'category' 
ORDER BY name 

Петля по результатам и захватить последние 5 записей из term_id:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND (wp_term_relationships.term_taxonomy_id IN (5)) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.ID DESC LIMIT 0, 5 

Заменить wp_term_relationships.term_taxonomy_id IN (6) с соответствующими идентификаторами из цикла.

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