質問: switch_to_blogが機能しなくなるのはなぜですか? 私はwordpress 3.0のマルチサイト機能を使用しています、そして私はメインサイトのフロントページのサブサイトの一つからランダムな投稿を一つ表示するサイトのネットワークを構築しています。私はこれを部分的には、古いwpmu関数リストのswitch_to_blog関数を使って達成しています。昨日まで、switch_to_blogという名前の関数を呼び出して配列を作成し、ブログの名前、投稿の詳細、投稿のサムネイルなどを配列に追加してから、restore_current_blogを使用してメインのブログのコンテキストに戻りました。それから私は私がつかんだそのポストに必要なものをエコーアウトするためにそのアレイを使いました。それはうまくいった。突然、switch_to_blogを呼び出してから、そのブロック内からbloginfo()を呼び出してテストするだけでも、トップレベルのブログの名前がそのまま反映され、ブログに切り替わりません。その機能は完全に廃止され、ランダムなバグのために機能しませんか?誰もがそれを回避するための洞察力やアイデアを持っている、または私はこれを回避するためにカスタムの$wpdb->get_results();クエリを書く必要がありますか?ありがとうございます。
回答: 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; }