Почему переход на блог перестал бы работать?


Я использую многосайтовую функциональность WordPress 3.0, и у меня есть сеть сайтов, на которых я показываю одно случайное сообщение с одного из дочерних сайтов на главной странице основного сайта. Я достигаю этого, частично, с помощью функции switch_to_blog из старого списка функций WPMU.

До вчерашнего дня я мог вызывать функцию, которая вызывала switch_to_blog, создавала массив, добавляла название блога, сведения о публикации, миниатюру публикации и т. Д. в массив, а затем использовал restore_current_blog для перехода вернемся к контексту основного блога. Затем я использовал этот массив, чтобы воспроизвести то, что мне было нужно для того поста, который я захватил. Это сработало отлично.

Внезапно, когда я звоню switch_to_blog, а затем из этого блока я звоню bloginfo(), просто чтобы проверить его, он по-прежнему повторяет название блога верхнего уровня, а НЕ переключенного на блог.

Является ли эта функция полностью устаревшей и неработоспособной из-за случайных ошибок? У кого-нибудь есть какие-либо идеи или идеи, чтобы обойти это, или мне нужно написать пользовательский запрос $wpdb->get_results();, чтобы обойти это?

Спасибо!

Author: Jason Rhodes, 2010-11-29

3 answers

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

function get_intro_post($blogid, $thumb_size='') {

  global $wpdb, $post;

  // Get the system defined table prefix
  $prefix = $wpdb->prefix;

  // Create a full table prefix by combining the system prefix with the blogid
  $tbl = $prefix . $blogid;

  // First query selects posts with the 'Introduction' category
  $sql = "SELECT `ID` FROM {$tbl}_posts as p";
  $sql .= " JOIN {$tbl}_term_relationships tr ON p.ID = tr.object_id";
  $sql .= " JOIN {$tbl}_terms t ON tr.term_taxonomy_id = t.term_id";
  $sql .= " WHERE t.name = 'Introduction'";

  // Only want/expect one result row, so use get_row()
  $intro = $wpdb->get_row($sql);
  $postid = $intro->ID;

  // Second query joins the postmeta table to itself so that I can find
  // the row whose post_id matches the _thumbnail_id, found in meta_value, 
  // for the post whose post_id matches the one I found in the previous query.
  $sql = "SELECT p2.meta_key, p2.meta_value FROM  `{$tbl}_postmeta` p1";
  $sql .=   " JOIN  `{$tbl}_postmeta` p2 ON p1.meta_value = p2.post_id";
  $sql .=   " WHERE p1.meta_key =  '_thumbnail_id'";
  $sql .=   " AND p1.post_id =  '{$postid}'";
  $sql .=   " LIMIT 0 , 30";

  // Expecting 2 result rows, so use get_results()
  $thumb_meta = $wpdb->get_results($sql);

  // Set $src to FALSE as the default
  $src = FALSE;

  // Make sure the query returned results
  if(!empty($thumb_meta)) {
    foreach($thumb_meta as $row) {
        // We just want to find the row where meta_key is the attached file
        // and then set our $src var to that value, which is the image path
        if ($row->meta_key == "_wp_attached_file") $src = $row->meta_value;
    }
  }

  // If we found an image path above, I'll append the rest of the path to the front
  if($src) { $src = "/wp-content/blogs.dir/{$blogid}/files/{$src}"; }

  // Handy core function to grab the blogname of another network's blog, by ID
  $blogname = get_blog_details( $blogid )->blogname;

  // Make an associative array holding the elements we need, 
  // some pulled from the global $post context
  $p = array(
    'title' => get_the_title(),
    'content' => get_the_content(),
    'excerpt' => get_the_excerpt(),
    'permalink' => get_permalink(),
    'blogname' => $blogname,
    'thumbnail' => $src
  );

  // Return an object with the post details mentioned above
  return (object) $p;
}
 4
Author: Jason Rhodes, 2010-11-29 19:15:56

Существует несколько проблем switch_to_blog(), связанных с кэшированием:

Подождите до 3.2 для полной надежности... (Если тогда...)

 2
Author: Denis de Bernardy, 2010-11-29 22:15:24

Меня так и подмывает спросить, что произошло вчера. :) Установлены новые плагины? Обновление?

Да, функция устарела, но все еще используется для плагинов, а также довольно подвержена непредсказуемости.

 0
Author: andrea_r, 2010-11-29 19:09:33