Все посты сети

Оказывается, до сих никто не придумал (либо же не поделился для гугла кодом) решения, которое бы позволяло брать все посты сети вордпрес и выдавать самые свежие в хронологическом порядке. С кучи перебранных мною форумов нашлось только решение которое сначала создает массив обновленных блогов а потом прокручивает их в цикле, выводя по одной записи из каждого. Но при этом никак не получается хрнологический список постов всех сайтов сети. Ибо в одном блоге добавился один пост, в другом – пять. Решение только в том, чтобы связывать все таблицы с постами всех сайтов воедино и формировать вывод уже оттуда.

Для этого создал заготовку, которая как-бы рабоатет

$allposts = $wpdb->get_results("
(SELECT ID, post_date, post_content, post_title, post_excerpt, post_status, guid, post_type FROM wp_7_posts WHERE post_status = 'publish' AND post_type = 'post' ) 

UNION ALL

(SELECT ID, post_date, post_content, post_title, post_excerpt, post_status, guid, post_type FROM wp_1_posts WHERE post_status = 'publish' AND post_type = 'post' )

ORDER BY post_date DESC LIMIT 5
    ");

foreach ($allposts as $post) {
     setup_postdata($post);

(Кстати, тут интересно почему при запросе через звездочку * оно не работает)

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

Чтобы получить айди всех наявных сайтов в сети есть такой кусок

$query = "SELECT blog_id FROM $wpdb->blogs WHERE blog_id !='1'";

Но как теперь все эти запросы с юнионами прокрутить в цикле? Т.е. по сути надо в SQL-запрос втулить перебор массива. Как такое можно реализорвать? Гугл не помогает, тут без чудого опыта не обойтись…

Оказывается, до сих никто не придумал

Не только придумал, но и успешно продает 🙂
http://premium.wpmudev.org/project/recent-global-posts-widget

при запросе через звездочку * оно не работает

В какое, простите, место, sql Вы хотели вставить звездочку?

В какое, простите, место, sql Вы хотели вставить звездочку?

Ну вот сюда

(SELECT * FROM wp_7_posts WHERE....

А что, так низзя? 🙂 Я просто заметил, что звездочка не работает если цикл постов выводить через страндартный луп со стандартными функциями, а при цикле, в котором посты выводятся путем перебора массива, кажись, все ок.

Не только придумал, но и успешно продает 
http://premium.wpmudev.org/project/recent-global-posts-widget

Ну, мы ж не знаем что они там написали. Как покупать-то когда нельзя пощупать? Может там то же самое что и в открытом доступе лежит и по принципу работы не подходит!? Мы и сами можем нагородить при желании и помощи Ю.Б. 😆

$full =  $_SERVER['DOCUMENT_ROOT'];
require($full.'/wp-blog-header.php');
    global $wpdb;
    global $table_prefix;
    
    
 $querycol = "SELECT COUNT(blog_id) FROM $wpdb->blogs WHERE blog_id !='1' AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0'";
$blogscol = $wpdb->get_col($querycol);
$blogskilkist = $blogscol[0];
   
$query = "SELECT blog_id FROM $wpdb->blogs WHERE blog_id !='1' AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0'";
$blogs = $wpdb->get_col($query);
    
$counter = 1;
    
foreach ($blogs as $blog) {
  
if ($counter == 1) { 
$superquery = 'SELECT ID, post_date, post_content, post_title, post_excerpt, post_status, post_name, guid, post_type FROM wp_';
} else {
$superquery .= 'SELECT ID, post_date, post_content, post_title, post_excerpt, post_status, post_name, guid, post_type FROM wp_'; 
}
$superquery .= $blog;
$superquery .= "_posts WHERE post_status = 'publish' AND post_type = 'post'";
if($counter < $blogskilkist) {
$superquery .= ' UNION ALL ';
}
if($counter == $blogskilkist) {
$superquery .= ' ORDER BY post_date DESC LIMIT 15';
}
$counter++;
    }
    
    
 $allposts = $wpdb->get_results($superquery); ?>

 <?php if ($allposts): ?>
 <?php global $post; global $more; ?>
 <?php foreach ($allposts as $post): ?>
 <?php setup_postdata($post); ?>
 

 <div class="post" id="post-<?php the_ID(); ?>">
 <h2><a href="<?php echo $post->guid; ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
    <?php the_title(); ?></a></h2>
   
    стандартные функции

 </div>
 <?php endforeach; ?>
 <?php else : ?>
   
 <?php endif; ?>

Все почти отлично работает. Проблема возникла только с ссылкой на пост (догадываюсь почему но сказать точно не могу) и пришлось юзать
$post->guid. Так же мне непонятно почему в таком случае при сипользовании the_content("далее") не рабоатет обрезка поста.

Ни и еще несколько вопросов надо решить:
1/ Поскольку мы скорее всего хотим отображать контент со всех блогов (люди по разному форматируют свои записи) в одном месте в одних стилях, надо научиться пользоваться регуляркой чтобы вырезать из контента одну картинку (сам адрес картинки) и прикрутить к ней свои стили (текст можно подключить через excerpt)
2/ Придумать как с помощью той же регулярки из ссылки на пост получить адрес блога (должно быть легко), а уже их него каким-то макаром получить название блога (сложно, функций по получению массива с инфой блога по его слагу не встречал, наверное придется лезть с этим слагом в базу данных и там искать 🙁 )

Буду очень признателен за подсказки, оптимизацию и т.д.

Ну вот сюда

(SELECT * FROM wp_7_posts WHERE....

Нельзя, если у таблиц, склеенных UNION, разное количество полей. А вообще можно. По крайней мере, в 5.1 работает без вопросов.

Ну, мы ж не знаем что они там написали.

Это Вы не знаете, а я знаю 😛

пришлось юзать $post->guid

Не знаю как сейчас, а раньше оно соответствовало ЧПУ на момент создания поста. При смене ЧПУ там фигня получается.

Это Вы не знаете, а я знаю

Купили? )))

Не знаю как сейчас, а раньше оно соответствовало ЧПУ на момент создания поста. При смене ЧПУ там фигня получается.

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

По крайней мере, в 5.1 работает без вопросов.

А когда-то, помню, вы меня подкалывали по поводу указанной мной версии движка 😉

Не, подсмотрел у того, кто купил 🙂

Вышеупомянутому плагину для работы нужны дополнительные прибамбасы. WPMUшники используют плагин Post Indexer, который собирает в отдельную таблицу все посты со всех блогов (фактически дублирует), дополняя их всем чем можно, в том числе, и пермалинками. Поэтому у них выборка получается очень лёгкая и быстрая. Аналогично с термами – всё валят в кучу.

Anonymous
Отправить
Ответ на: