@blog.justoneplanet.info

日々勉強

jopGlobalBlogArchive(WordPress MU Plugin)

WordPress MUで、表示中以外のブログを含めたサイト全体の新着ブログを表示するプラグインです。デフォルトのWordPress MUではできませんが、このプラグインを使えば可能になります。

みなさまのお問い合わせやバグの指摘などから「正しい動作の実現」や「機能の追加」ができ、大変ありがたい限りです。是非とも、遠慮なくコメント欄でお問い合わせください。

■ダウンロード

version 0.1.8(2009.09.15 latest release)
WordPress MU 2.8.3でテスト(運用中)
文字数制限機能の追加。
ブログIDの指定による表示ブログ・非表示ブログ指定機能の追加。
ページのリンク書き出しのにおけるバグを修正。
version 0.1.7(2009.09.04)
WordPress MU 2.8.3でテスト(運用中)
<!–more–>タグ以降の表示をオプションで設定できるように改良。
version 0.1.6(2009.08.28)
WordPress MU 2.8.3でテスト
インストール後に全ての記事で「投稿を更新」のボタンを押すことなく、記事を表示できるように改良。
version 0.1.5(2009.08.27)
WordPress MU 2.8.3でテスト
JopGlobalBlogIndex::the_timeメソッドにおいて、Wordpressと同じ引数が指定できるように改良。
version 0.1.4(2009.08.11)
WordPress MU 2.8.3でテスト
prefixをデフォルト以外にした時、投稿者名が表示されないバグを修正
ブログのタイトルや本文に(SQL文で使用される)特殊な文字があった場合に、投稿が表示されないバグを修正
複数回ループできないバグを修正
version 0.1.3(2009.07.09)
記事の削除ができないバグを修正
version 0.1.2(2009.06.24)
投稿者名が表示されるように改良
version 0.1.1
β版:Warningの警告が出るのを修正
WordPress MU 2.7.0でテスト済み(運用中)
ディレクトリでブログを増やす場合でテスト済み、サブドメインの場合は未検証
version 0.1.0(2009.04.22)
β版
WordPress MU 2.7.0でテスト済み(運用中)
ディレクトリでブログを増やす場合でテスト済み、サブドメインの場合は未検証

■仕様

  • PHP5以上
  • サブドメインでブログを管理する設定には未対応

■インストール方法

  1. 「/wp-content/mu-plugins/」に解凍したファイル、「jopGlobalBlogArchive.php」を設置する

■使い方

テンプレート

例えば以下のような記述をテンプレート内にすると、サイト内の新規ブログを新しい順に5個(デフォルト)表示します。x個表示したい場合は、have_posts()の引数をhave_posts(x)と記述すれば、任意の回数だけ表示します。

通常のWordPressタグと同じようなコントロールができます。但し、query_posts関数は使用できません。

<div class="section">
<?php while(JopGlobalBlogIndex::have_posts()): ?>
<?php JopGlobalBlogIndex::the_post(); ?>
<div class="item">
<h3><a href="<?php print(JopGlobalBlogIndex::the_permalink()); ?>" title="<?php print(JopGlobalBlogIndex::the_title()); ?>"><?php print(JopGlobalBlogIndex::the_title()); ?></a>(<?php print(JopGlobalBlogIndex::the_author()); ?>)<?php print(JopGlobalBlogIndex::the_time('Y/m/d H:i:s')); ?></h3>
<p class="item_category">Category: <?php print(JopGlobalBlogIndex::the_category()); ?></p>
<?php print(JopGlobalBlogIndex::the_content()); ?>
<p class="readmore"><a href="<?php print(JopGlobalBlogIndex::the_permalink()); ?>" title="<?php print(JopGlobalBlogIndex::the_title()); ?>">Read More</a></p>
</div>
<?php endwhile; ?>
</div>

解説

<?php while(JopGlobalBlogIndex::have_posts([int $limit = 5[, array $option = array('allowedId' => array(), 'restrictedId' => array())]])): ?>
<?php JopGlobalBlogIndex::the_post(); ?>

から

<?php endwhile; ?>

の部分が記事の個数だけループされる部分です。$option[‘allowedId’]には表示したいブログのIDを配列で指定でき、$option[‘restrictedId’]には表示したくないブログのIDを指定できます。但し、$option[‘allowedId’]か$option[‘restrictedId’]の一方しか使用できず、両方指定してある場合は前者が有効となります。

ループの中で使えるタグ一覧
<?php print(JopGlobalBlogIndex::the_permalink()); ?>
記事のリンクを表示
<?php print(JopGlobalBlogIndex::the_title()); ?>
記事のタイトルを表示
<?php print(JopGlobalBlogIndex::the_author()); ?>
記事の投稿者名を表示
<?php print(JopGlobalBlogIndex::the_time(‘Y/m/d H:i:s’)); ?>
記事の公開日時を表示
<?php print(JopGlobalBlogIndex::the_category()); ?>
記事のカテゴリーを表示
<?php print(JopGlobalBlogIndex::the_summary([int $limit = 50])); ?>
記事の本文を表示。引数にtrueを設定すると、<!–more–>以降は表示されなくなる。デフォルトはfalse
<?php print(JopGlobalBlogIndex::the_content([bool $omission = false])); ?>
記事の本文を表示。引数にtrueを設定すると、<!–more–>以降は表示されなくなる。デフォルトはfalse

■既知のバグ

パーマリンクについて
リンクを書き換えるプラグインを使用し、親ブログと子ブログのうちどちらか一方で使用していた場合、リンクの書き換えに失敗し、正しいリンク先が表示できない。

■version 0.1.8 ソースコード

jopGlobalBlogArchive.php

「/wp-content/mu-plugins/jopGlobalBlogArchive.php」

<?php
/*
Plugin Name: jopGlobalBlogArchive
Plugin URI: http://blog.justoneplanet.info/wp-content/uploads/wordpressmu/jopGlobalBlogArchive/
Description: Prepare the list of some newer posts and categories from WPMU.
Author: Mitsuaki Ishimoto
Version: 0.1.8
Author URI: http://blog.justoneplanet.info/
*/
/*  Copyright 2009  Mitsuaki Ishimoto  (email : justoneplanet.info)

    This program is free software; fundamentally, you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
    
    But the Author(:Mitsuaki Ishimoto) can deny for someone evil or immoral to use this plugin.
    it means someone evil or immoral is the people and organizations to hold a candle to the devil,
    to harm someone, not to observe various laws, not to contribute society and so on.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
//=======================================================
//actions
add_action('publish_post', 'jopSavePostForArchive');
add_action('publish_page', 'jopSavePostForArchive');
add_action('delete_post', 'jopDeletePostForArchive');

add_action('delete_category', 'jopDeleteCategoryForArchive');
//=======================================================
//class
class JopGlobalBlogIndex {
	/*
	 * $global_prefix
	 * (string) : prefix of database not including blog id
	 */
	private static $global_prefix;
	/*
	 * $post
	 * (object) : data of a post at current loop
	 */
	private static $post;
	/*
	 * $posts
	 * (array) : data of posts from the global post's table of database
	 */
	private static $posts;
	/*
	 * $counter
	 * (int) : counter for counting of loop
	 */
	private static $counter = 0;
	/**
	 * __construct
	 * An instantiation is prohibited.
	 */
	private function __construct(){
		throw new Exception('An instantiation is prohibited.');
	}
	/**
	 * getOptionsByBlogId
	 * get user's option defined by blog id and key
	 * @return (string) maybe_unserialize($_wp_alloptions[$blog_id][$key]) : option's value
	 * @param (string) $key : the key you need
	 * @param (string) maybe_unserialize($_wp_alloptions[$blog_id][$key]) : option's value
	 */
	private static function getOptionsByBlogId($key, $id){
		global $wpdb;
		$suppress = $wpdb->suppress_errors();
		$alloptions_db = $wpdb->get_results(
			"SELECT option_name, option_value FROM " . self::$global_prefix . $id . "_options FORCE INDEX(PRIMARY) ORDER BY option_id ASC"
		);
		$wpdb->suppress_errors($suppress);
		foreach((array)$alloptions_db as $o){
			$_wp_alloptions[$blog_id][$o->option_name] = $o->option_value;
		}
		wp_cache_set('alloptions', $_wp_alloptions[$blog_id], 'options');
		return maybe_unserialize($_wp_alloptions[$blog_id][$key]);		
	}
	/**
	 * get_page_uri
	 * @return 
	 */
	private static function get_page_uri(){
		global $wpdb;
		$uri = self::$post->post_name;
		if(self::$post->post_parent == self::$post->ID){
			return $uri;
		}
		$id = self::$post->post_parent;
		while($id != 0){
			$sql = "SELECT
						`ID`,`post_name`,`post_parent`
					FROM " . self::$global_prefix . self::$post->blog_id . "_posts
					WHERE `ID` = '{$id}'";
			$result = $wpdb->get_results($sql, OBJECT);
			$result = $result[0];
			$id = $result->post_parent;
			$uri = $result->post_name . "/" . $uri;
		}
		return $uri;
	}
	/**
	 * _get_page_link
	 * @return (string)
	 * @param boolean $id[optional]
	 * @param boolean $leavename[optional]
	 */
	private static function _get_page_link($id = false, $leavename = false){
		global $wp_rewrite;
		$pagestruct = $wp_rewrite->get_page_permastruct();	
		if($pagestruct != ''){
			$link = self::get_page_uri($id);
			$link = ($leavename)? $pagestruct : str_replace('%pagename%', $link, $pagestruct);
			$link = trailingslashit(self::getOptionsByBlogId('home', self::$post->blog_id)) . "$link";
			$link = user_trailingslashit($link, 'page');
		}
		else{
			$link = trailingslashit(self::getOptionsByBlogId('home', self::$post->blog_id)) . "?page_id={$post->post_id}";
		}
		return apply_filters('_get_page_link', $link, $id);		
	}
	/**
	 * get_page_link
	 * @return (string) page_link
	 */
	private static function get_page_link($id = false, $leavename = false){
		if('page' == self::getOptionsByBlogId('show_on_front', self::$post->blog_id) && self::$post->post_id == self::getOptionsByBlogId('page_on_front', self::$post->blog_id)){
			$link = self::getOptionsByBlogId('home', self::$post->blog_id);
		}
		else{
			$link = self::_get_page_link($id, $leavename);
		}
		return apply_filters('page_link', $link, $id);
	}
	/**
	 * get_permalink
	 * get the permalink from current post
	 * @return the permalink
	 * @param (int) $id[optional]
	 * @param (bool?) $leavename[optional]
	 */
	private static function get_permalink($id = 0, $leavename = false) {
		if(empty(self::$post->ID)){
			return false;
		}
		if(self::$post->post_type == 'page'){
			return self::get_page_link(self::$post->ID, $leavename);
		}
		elseif(self::$post->post_type == 'attachment'){
			return get_attachment_link(self::$post->ID);
		}
		$permalink = get_option('permalink_structure');
		if('' != $permalink && !in_array(self::$post->post_status, array('draft', 'pending'))){
			$unixtime = strtotime(self::$post->post_date);
			$category = '';
			if(strpos($permalink, '%category%') !== false){
				$cats = get_the_category(self::$post->ID);
				if($cats){
					usort($cats, '_usort_terms_by_ID'); // order by ID
					$category = $cats[0]->slug;
					if($parent = $cats[0]->parent){
						$category = get_category_parents($parent, false, '/', true) . $category;
					}
				}
				// show default category in permalinks, without
				// having to assign it explicitly
				if(empty($category)) {
					$default_category = get_category(get_option('default_category'));
					$category = is_wp_error($default_category) ? '' : $default_category->slug;
				}
			}
			$author = '';
			if(strpos($permalink, '%author%') !== false){
				$authordata = get_userdata(self::$post->post_author);
				$author = $authordata->user_nicename;
			}
			$date = explode(" ", date('Y m d H i s', $unixtime));
			$blog_path = explode('/', self::$post->path);
			$blog_path = $blog_path[count($blog_path) - 2];
			$rewritecode = array(
				'blog',
				'%year%',
				'%monthnum%',
				'%day%',
				'%hour%',
				'%minute%',
				'%second%',
				$leavename? '' : '%postname%',
				'%post_id%',
				'%category%',
				'%author%',
				$leavename? '' : '%pagename%',
			);
			$rewritereplace = array(
				(self::$post->blog_id == 1)? 'blog' : $blog_path,
				$date[0],
				$date[1],
				$date[2],
				$date[3],
				$date[4],
				$date[5],
				self::$post->post_name,
				self::$post->ID,
				$category,
				$author,
				self::$post->post_name,
			);
			$permalink = get_option('home') . str_replace($rewritecode, $rewritereplace, $permalink);
			$permalink = user_trailingslashit($permalink, 'single');
			return apply_filters('post_link', $permalink, self::$post, $leavename);
		}
		else{ // if they're not using the fancy permalink option
			$permalink = get_option('home') . '/?p=' . self::$post->ID;
			return apply_filters('post_link', $permalink, self::$post, $leavename);
		}
	}
	/**
	 * savePost
	 * save post into the table '(prefix_)jop_global_posts' on installing and updating
	 * @return (null)
	 * @param (object) $result
	 * @param (int) $blogid
	 */
	public static function savePost($result, $blogid){
		global $wpdb;
		$id = $result['ID'];
		$sql = "INSERT INTO " . self::getGlobalPrefix() . "jop_global_posts(
			`blog_id`,
			`post_id`,
			`identifier`,
			`post_author`,
			`post_date`,
			`post_date_gmt`,
			`post_content`,
			`post_title`,
			`post_category`,
			`post_excerpt`,
			`post_status`,
			`comment_status`,
			`ping_status`,
			`post_password`,
			`post_name`,
			`to_ping`,
			`pinged`,
			`post_modified`,
			`post_modified_gmt`,
			`post_content_filtered`,
			`post_parent`,
			`guid`,
			`menu_order`,
			`post_type`,
			`post_mime_type`,
			`comment_count`
		) VALUES('"
			. $blogid . "', '"
			. $result['ID'] . "', '"
			. $blogid . "/" . $result['ID'] . "', '"
			. $wpdb->_real_escape($result['post_author']) . "', '"
			. $result['post_date'] . "', '"
			. $result['post_date_gmt'] . "', '"
			. $wpdb->_real_escape($result['post_content']) . "', '"
			. $wpdb->_real_escape($result['post_title']) . "', '"
			. $result['post_category'] . "', '"
			. $wpdb->_real_escape($result['post_excerpt']) . "', '"
			. $wpdb->_real_escape($result['post_status']) . "', '"
			. $wpdb->_real_escape($result['comment_status']) . "', '"
			. $wpdb->_real_escape($result['ping_status']) . "', '"
			. $wpdb->_real_escape($result['post_password']) . "', '"
			. $wpdb->_real_escape($result['post_name']) . "', '"
			. $wpdb->_real_escape($result['to_ping']) . "', '"
			. $wpdb->_real_escape($result['pinged']) . "', '"
			. $result['post_modified'] . "', '"
			. $result['post_modified_gmt'] . "', '"
			. $wpdb->_real_escape($result['post_content_filtered']) . "', '"
			. $result['post_parent'] . "', '"
			. $wpdb->_real_escape($result['guid']) . "', '"
			. $result['menu_order'] . "', '"
			. $wpdb->_real_escape($result['post_type']) . "', '"
			. $wpdb->_real_escape($result['post_mime_type']) . "', '"
			. $result['comment_count'] . "'
		) ON DUPLICATE KEY UPDATE "
			. "`post_author` = '"           . $wpdb->_real_escape($result['post_author']) . "',"
			. "`post_date` = '"             . $result['post_date'] . "',"
			. "`post_date_gmt` = '"         . $result['post_date_gmt'] . "',"
			. "`post_content` = '"          . $wpdb->_real_escape($result['post_content']) . "',"
			. "`post_title` = '"            . $wpdb->_real_escape($result['post_title']) . "',"
			. "`post_category` = '"         . $result['post_category'] . "',"
			. "`post_excerpt` = '"          . $wpdb->_real_escape($result['post_excerpt']) . "',"
			. "`post_status` = '"           . $wpdb->_real_escape($result['post_status']) . "',"
			. "`comment_status` = '"        . $wpdb->_real_escape($result['comment_status']) . "',"
			. "`ping_status` = '"           . $wpdb->_real_escape($result['ping_status']) . "',"
			. "`post_password` = '"         . $wpdb->_real_escape($result['post_password']) . "',"
			. "`post_name` = '"             . $wpdb->_real_escape($result['post_name']) . "',"
			. "`to_ping` = '"               . $wpdb->_real_escape($result['to_ping']) . "',"
			. "`pinged` = '"                . $wpdb->_real_escape($result['pinged']) . "',"
			. "`post_modified` = '"         . $result['post_modified'] . "',"
			. "`post_modified_gmt` = '"     . $result['post_modified_gmt'] . "',"
			. "`post_content_filtered` = '" . $wpdb->_real_escape($result['post_content_filtered']) . "',"
			. "`post_parent` = '"           . $result['post_parent'] . "',"
			. "`guid` = '"                  . $wpdb->_real_escape($result['guid']) . "',"
			. "`menu_order` = '"            . $result['menu_order'] . "',"
			. "`post_type` = '"             . $wpdb->_real_escape($result['post_type']) . "',"
			. "`post_mime_type` = '"        . $wpdb->_real_escape($result['post_mime_type']) . "',"
			. "`comment_count` = '"         . $result['comment_count'] . "'";
		$wpdb->query($sql);
		
		/*
		 * pick up the term id for save
		 */
		$sql = "SELECT "
					. self::getGlobalPrefix() . $blogid . "_term_relationships.object_id, "
					. self::getGlobalPrefix() . $blogid . "_term_taxonomy.term_id
				FROM "
					. self::getGlobalPrefix() . $blogid . "_term_relationships
				LEFT JOIN "
					. self::getGlobalPrefix() . $blogid . "_term_taxonomy
				ON "
					. self::getGlobalPrefix() . $blogid . "_term_relationships.term_taxonomy_id = " . self::getGlobalPrefix() . $blogid . "_term_taxonomy.term_taxonomy_id
				WHERE "
					. self::getGlobalPrefix() . $blogid . "_term_relationships.`object_id` = '{$result['ID']}'";
		$result = $wpdb->get_results($sql, ARRAY_A);
		/*
		 * Once deleting for update
		 */
		$sql = "DELETE FROM "
					. self::getGlobalPrefix() . "jop_global_term_relationships
				WHERE `object_id` = '{$id}'
				AND `blog_id` = '{$blogid}'";
		$wpdb->query($sql);
	
		/*
		 * insert
		 */
		$values = array();
		foreach($result as $key => $value){
			$values[] = "'{$value['object_id']}', '{$blogid}', '{$value['term_id']}', '{$blogid}/{$value['object_id']}/{$value['term_id']}'";
		}
		$values = '(' . implode('),(', $values) . ')';
		$sql = "INSERT INTO " . self::getGlobalPrefix() . "jop_global_term_relationships(
			`object_id`,
			`blog_id`,
			`cat_ID`,
			`identifier`
		) VALUES $values";
		$wpdb->query($sql);
	}
	/**
	 * install
	 * 1st query makes the table that keep the posts written by all users.
	 * 2nd query makes the table that keep the terms written by all users.
	 * @return (null)
	 */
	private static function install(){
		global $wpdb;
		$table_name = self::$global_prefix . "jop_global_term_relationships";
		if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name){
			$sql = "CREATE TABLE IF NOT EXISTS `$table_name` (
						`object_id` bigint(20) NOT NULL DEFAULT '0',
						`blog_id` int(11) NOT NULL DEFAULT '0',
						`cat_ID` bigint(20) NOT NULL DEFAULT '0',
						`identifier` varchar(255) NOT NULL DEFAULT '0/0',
						UNIQUE KEY `identifier` (`identifier`),
						KEY `cat_ID` (`cat_ID`),
						KEY `blog_id` (`blog_id`)
					) ENGINE=MyISAM DEFAULT CHARSET=utf8";
			$wpdb->get_results($sql);
		}
		$table_name = self::$global_prefix . "jop_global_posts";
		if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name){
			$sql = "CREATE TABLE IF NOT EXISTS `$table_name` (
						`ID` bigint(20) NOT NULL AUTO_INCREMENT,
						`blog_id` int(11) NOT NULL DEFAULT '0',
						`post_id` int(11) NOT NULL DEFAULT '0',
						`identifier` varchar(255) NOT NULL,
						`post_author` bigint(20) NOT NULL DEFAULT '0',
						`post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
						`post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
						`post_content` longtext NOT NULL,
						`post_title` text NOT NULL,
						`post_category` int(4) NOT NULL DEFAULT '0',
						`post_excerpt` text NOT NULL,
						`post_status` varchar(20) NOT NULL DEFAULT 'publish',
						`comment_status` varchar(20) NOT NULL DEFAULT 'open',
						`ping_status` varchar(20) NOT NULL DEFAULT 'open',
						`post_password` varchar(20) NOT NULL,
						`post_name` varchar(200) NOT NULL,
						`to_ping` text NOT NULL,
						`pinged` text NOT NULL,
						`post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
						`post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
						`post_content_filtered` text NOT NULL,
						`post_parent` bigint(20) NOT NULL DEFAULT '0',
						`guid` varchar(255) NOT NULL,
						`menu_order` int(11) NOT NULL DEFAULT '0',
						`post_type` varchar(20) NOT NULL DEFAULT 'post',
						`post_mime_type` varchar(100) NOT NULL,
						`comment_count` bigint(20) NOT NULL DEFAULT '0',
						PRIMARY KEY (`ID`),
						UNIQUE KEY `identifier` (`identifier`),
						KEY `blog_id` (`blog_id`),
						KEY `post_id` (`post_id`)
					) ENGINE=MyISAM  DEFAULT CHARSET=utf8";
			$wpdb->get_results($sql);
			/*
			 * save the posts have been published.
			 */
			$tables = $wpdb->get_results("SHOW TABLES LIKE '" . self::$global_prefix . "_\_posts'", ARRAY_N);
			foreach($tables as $table){
				$results = $wpdb->get_results("SELECT * FROM {$table[0]} WHERE `post_status` = 'publish'", ARRAY_A);
				$blogid = str_replace(array(self::$global_prefix, '_posts'), '', $table[0]);
				foreach($results as $result){
					self::savePost($result, $blogid);
				}
			}
		}
	}
	/**
	 * init
	 * @return null
	 */
	public static function init(){
		global $wpdb;
		self::$global_prefix = preg_replace("/[0-9]+_/", '', $wpdb->prefix);
		self::install();
	}
	/**
	 * getGlobalPrefix
	 * method for access to prefix
	 * @return (string) self::$global_prefix : table prefix
	 */
	public static function getGlobalPrefix(){
		return self::$global_prefix;
	}
	/**
	 * have_posts
	 * set the list of newer posts written by all users if self::$posts is not set
	 * judge if the self::$posts of current index exist or not
	 * @return (bool)
	 * @param (int) $limit : define the number of rows.
	 * @param (array) $option : define the option.
	 */
	public static function have_posts($limit = 5, $option = array()){
		global $wpdb;
		if(!isset(self::$posts)){
			$col = array(
				'ID',
				'blog_id',
				'post_id',
				'post_date',
				'post_content',
				'post_name',
				'post_author',
				'post_title',
				'post_category',
				'post_status',
				'post_type',
				'post_parent',
				'guid'
			);
			foreach($col as $key => $value){
				$col[$key] = self::$global_prefix . "jop_global_posts." . $value;
			}
			$col = implode(',', $col);
			$sqlForAllowedBlog = '';
			if(is_array($option['allowedId'])){
				for($i = 0; $i < count($option['allowedId']); $i++){
					if(is_int($option['allowedId'][$i]) && $option['allowedId'][$i] > 0){
						$sqlForAllowedBlog .= " OR " . self::$global_prefix . "jop_global_posts.`blog_id` = '{$option['allowedId'][$i]}'";
					}
				}
				$sqlForAllowedBlog = substr($sqlForAllowedBlog, 4);
			}
			elseif(is_array($option['restrictedId'])){
				for($i = 0; $i < count($option['restrictedId']); $i++){
					if(is_int($option['restrictedId'][$i]) && $option['restrictedId'][$i] > 0){
						$sqlForAllowedBlog .= " AND " . self::$global_prefix . "jop_global_posts.`blog_id` != '{$option['restrictedId'][$i]}'";
					}
				}
				$sqlForAllowedBlog = substr($sqlForAllowedBlog, 5);
			}
			if($sqlForAllowedBlog !== ''){
				$sqlForAllowedBlog = " AND ($sqlForAllowedBlog) ";
			}
			$sql = "SELECT
						{$col}," . self::$global_prefix . "blogs.path
					FROM "
						. self::$global_prefix . "jop_global_posts
					LEFT JOIN "
						. self::$global_prefix . "blogs
					ON "
						. self::$global_prefix . "jop_global_posts.blog_id = " . self::$global_prefix . "blogs.blog_id
					WHERE "
						. self::$global_prefix . "jop_global_posts.`post_status` = 'publish'
					AND "
						. self::$global_prefix . "jop_global_posts.`post_password` = ''
					$sqlForAllowedBlog
					ORDER BY `post_date` DESC
					LIMIT 0,$limit";
			$result = $wpdb->get_results($sql, OBJECT);
			self::$posts = $result;
		}
		if(isset(self::$posts[self::$counter])){
			return true;
		}
		else{
			self::$counter = 0;
			self::$posts = null;//for multiple loop(in the case of different situation)
			return false;
		}
	}
	/**
	 * the_post
	 * get the post in a loop and set the counter for the next loop.
	 * @return (array) self::$post
	 */
	public static function the_post(){
		self::$post = self::$posts[self::$counter];
		self::$counter++;
		return self::$post;
	}
	/**
	 * the_title
	 * get the title from the current loop. 
	 * @return (string) self::$post->post_title
	 */
	public static function the_title(){
		return apply_filters('the_title', self::$post->post_title);
	}
	/**
	 * the_ID
	 * get the title from the current loop. 
	 * @return (string) self::$post->ID
	 */
	public static function the_ID(){
		return self::$post->ID;
	}
	/**
	 * the_permalink
	 * get the title from the current loop. 
	 * @return (string) self::$post->guid
	 */
	public static function the_permalink(){
		return apply_filters('the_permalink', self::get_permalink());
	}
	/**
	 * the_time
	 * get the title from the current loop. 
	 * @return (string) self::$post->post_date
	 */
	public static function the_time($d = ''){
		return apply_filters('the_time', self::get_the_time( $d ), $d);
	}
	/**
	 * get_the_time
	 * @return (String) date
	 */
	private function get_the_time($d = ''){
		if('' == $d){
			$the_time = get_post_time(get_option('time_format'), false, self::$post, true);
		}
		else{
			$the_time = get_post_time($d, false, self::$post, true);
		}
		return apply_filters('get_the_time', $the_time, $d, self::$post);
	}
	/**
	 * the_author
	 * get the title from the current loop. 
	 * @return (string) self::$post->post_author
	 */
	public static function the_author(){
		global $wpdb;
		$id = self::$post->post_author;
		$sql = "SELECT `user_nicename` FROM `" . self::$global_prefix . "users` WHERE `ID` = '$id'";
		$result = $wpdb->get_results($sql, ARRAY_N);
		return $result[0][0];
	}
	/**
	 * the_content
	 * get the body from the current loop. 
	 * @return (string) self::$post->post_content
	 */
	public static function the_content($stripteaser = false){
		$content = self::$post->post_content;
		if($stripteaser){
			list($content) = preg_split('/<!--more(.*?)?-->/', $content);
		}
		$content = apply_filters('the_content', $content);
		$content = str_replace(']]>', ']]&gt;', $content);
		return $content;
	}
	/**
	 * the_summary
	 * get the summary form the current loop.
	 * @return (string) self::$post->post_content
	 * @param (int) $limit
	 */
	public static function the_summary($limit = 50){
		if(!is_int($limit)){
			$limit = 50;
		}
		$content = self::$post->post_content;
		$funcs = get_defined_functions();
		if(in_array('mb_substr', $funcs['internal'])){
			$content = mb_substr(strip_tags($content), 0, $limit);
		}
		else{
			$content = substr(strip_tags($content), 0, $limit);
		}
		$content = str_replace(']]>', ']]&gt;', $content);
		return $content;
	}
	/**
	 * the_category
	 * get the title from the current loop. 
	 * @return (string) self::$post->post_category
	 */
	public static function the_category(){
		global $wpdb;
		$blog_id = self::$post->blog_id;
		$post_id = self::$post->post_id;
		$sql = "SELECT `"
					. self::$global_prefix . "sitecategories`.`cat_name`
				FROM `"
					. self::$global_prefix . "jop_global_term_relationships`
				LEFT JOIN `"
					. self::$global_prefix . "sitecategories`
				ON `"
					. self::$global_prefix . "jop_global_term_relationships`.`cat_ID` = `" . self::$global_prefix . "sitecategories`.`cat_ID`
				WHERE `"
					. self::$global_prefix . "jop_global_term_relationships`.`object_id` = '$post_id'
				AND `"
					. self::$global_prefix . "jop_global_term_relationships`.`blog_id` = '$blog_id'";
		$tmpAry = array();
		$result = $wpdb->get_results($sql, ARRAY_A);
		foreach($result as $key => $value){
			$tmpAry[] = $value['cat_name'];
		}
		sort($tmpAry);
		return implode(', ', $tmpAry);
	}
	/*prepare*/
	public static function the_tags(){
		return self::$post->post_title;
	}
	public static function the_title_attribute(){
		return self::$post->post_title;
	}
	/*categories*/
	/**
	 * wp_list_categories
	 * get the title from the current loop. 
	 * @return (string) self::$post->post_category
	 */
	public static function wp_list_categories($args = ''){
		$defaults = array(
			'show_option_all'    => '',
			'orderby'            => 'name',
			'order'              => 'ASC',
			'show_last_update'   => 0,
			'style'              => 'list',
			'show_count'         => 0,
			'hide_empty'         => 1,
			'use_desc_for_title' => 1,
			'child_of'           => 0,
			'feed'               => '',
			'feed_type'          => '',
			'feed_image'         => '',
			'exclude'            => '',
			'current_category'   => 0,
			'hierarchical'       => true,
			'title_li'           => __('Categories'),
			'echo'               => 1,
			'depth'              => 0
		);
		$r = wp_parse_args($args, $defaults);
		if(!isset($r['pad_counts']) && $r['show_count'] && $r['hierarchical']){
			$r['pad_counts'] = true;
		}
		if(isset($r['show_date'])){
			$r['include_last_update_time'] = $r['show_date'];
		}
		extract($r);
		$categories = get_categories($r);
		$output = '';
		if($title_li && 'list' == $style){
			$output = '<li class="categories">' . $r['title_li'] . '<ul>';
		}
		if(empty($categories)){
			if('list' == $style){
				$output .= '<li>' . __("No categories") . '</li>';
			}
			else{
				$output .= __("No categories");
			}
		}
		else{
			global $wp_query;
			if(!empty($show_option_all)){
				if('list' == $style){
					$output .= '<li><a href="' .  get_bloginfo('url')  . '">' . $show_option_all . '</a></li>';
				}
				else{
					$output .= '<a href="' .  get_bloginfo('url')  . '">' . $show_option_all . '</a>';
				}
			}
			if(empty($r['current_category']) && is_category()){
				$r['current_category'] = $wp_query->get_queried_object_id();
			}
			if($hierarchical){
				$depth = $r['depth'];
			}
			else{
				$depth = -1; // Flat.
			}
			$output .= walk_category_tree($categories, $depth, $r);
		}
		if($title_li && 'list' == $style){
			$output .= '</ul></li>';
		}
		$output = apply_filters('wp_list_categories', $output);
		if($echo){
			echo $output;
		}
		else{
			return $output;
		}
	}
}
JopGlobalBlogIndex::init();
//=======================================================
//functions
/**
 * jopDeleteCategoryForArchive
 * @return (null)
 * @param (int) $id 
 */
function jopDeleteCategoryForArchive($id){
	global $wpdb;
	$sql = "DELETE FROM "
				. JopGlobalBlogIndex::getGlobalPrefix() . "jop_global_term_relationships
			WHERE `blog_id` = '{$wpdb->blogid}' AND `cat_ID` = '{$id}'";
	$wpdb->query($sql);
}
/**
 * jopSavePostForArchive
 * @return (null)
 * @param (int) $id 
 */
function jopSavePostForArchive($id){
	global $wpdb;
	$sql = "SELECT * FROM "
				. JopGlobalBlogIndex::getGlobalPrefix() . $wpdb->blogid . "_posts
			WHERE `ID` = '$id'";
	$result = $wpdb->get_results($sql, ARRAY_A);
	$result = $result[0];
	JopGlobalBlogIndex::savePost($result, $wpdb->blogid);
}
/**
 * jopDeletePostForArchive
 * @return (null)
 * @param (int) $id 
 */
function jopDeletePostForArchive($id){
	global $wpdb;
	$sql = "DELETE FROM "
				. JopGlobalBlogIndex::getGlobalPrefix() . "jop_global_posts
			WHERE `identifier` = '" . $wpdb->blogid . '/' . $id . "'";
	$wpdb->query($sql);
	//var_dump($sql);
	//throw new Exception();
}
?>

■ライセンスについて

GNU General Public Licenseです。但し、法律に従わない組織や個人などの邪悪な(者の)使用は認めません。

43 Comments»

すみません。
連絡先が受け取れませんで勝手ながらコチラで回答させていただきます。

>テンプレート内に
> <?php print(JopGlobalBlogIndex::the_author());?>
>という記述を追加して、投稿者の名前を表示させようとしましたが、
>投稿車のIDの数字が表示されるだけで、投稿者の名前を表示させる事ができませんでした。

申し訳ありません。
バージョンアップしましたので再度ダウンロードしてご利用ください。
投稿者名が表示されるようになったかと思います。
個人的に使ってないメソッドの実装が遅れてしまい恥ずかしい限りです。

ご意見など反映させていきたいと思ってますので何かありましたら
コチラにコメント頂けますと幸いでございます。

投稿者のIDについて、ありがとうございました。
さらに、質問で恐縮なのですが・・・

一度投稿された記事は、投稿者が削除しても「サイト全体の新着ブログの表示」から消えないものなのでしょうか?
DBの「wp_jop_global_posts」から削除すると「サイト全体の新着ブログの表示」から消えるのですが・・・

何かWordPressMUの別の設定が必要なのでしょうか?

不慣れなものですみませんが、ご教示ください。よろしくお願いいたします。

ご報告ありがとうございます!

676行目のidentifierの生成方法が間違ってました。
(誤)WHERE `identifier` = ‘” . $id . ‘/’ . $wpdb->blogid . “‘”;
(正)WHERE `identifier` = ‘” . $wpdb->blogid . ‘/’ . $id . “‘”;
修正版をアップロードしました(最上部リンク)ので
お手数ですがご利用ください。

完全な個人開発ゆえ至らない箇所も多々ありますが
今後ともよろしくお願いします。
何か要望がありましたら遠慮なく言ってください。
クオリティをドンドン上げていきたいと思います(^o^)

public static function the_author(){
global $wpdb;
$id = self::$post->post_author;
$sql = “SELECT `user_nicename` FROM `”. self::$global_prefix .”users` WHERE `ID` = ‘$id'”;
$result = $wpdb->get_results($sql, ARRAY_N);
return $result[0][0];
}

DLさせていただきました
早速試したのですが、サイト全体の新着ブログを表示できません

例えば以下のような記述を…
↑は書いてあります

他のプラグインとの相性とかもあるのでしょうか?

mu 2.8.2 です

すみません。返信が遅くなってしまいました。

>mu 2.8.2 です
僕も同じバージョンでした。

>例えば以下のような記述を…
すみません…どの部分になりますでしょうか?

>他のプラグインとの相性とかもあるのでしょうか?
現在のところ確認できておりませんが
インストールされているプラグインをお教えいただけましたら
こちらでも検証してみます。

ちなみになんですが
サブドメイン毎にブログを設置している場合は
正しく動作しないかと思われます。

あとはPHPのエラーメッセージ等がありましたら
教えていただけますと幸いです。

すみませんが
よろしくお願いいたします。

上記で修正ソースしが記載してませんが、プレフィックスの利用ができない不具合がありました。

jopSavePostForArchive()にてレコード追加(更新)してますが、
文字列リテラルをあらわすシングルクォーテーションが
コメントカラムなどにある場合にSQL分が不正となり
正常に処理できなくなります。
mysql_real_escape_stringなどでエスケープする必要があるかと思います。

あと、private staticの問題で同じページにてこのプラグインで2回目のループをしようとするとできません。

ご指摘ありがとうございます。

>文字列リテラルをあらわすシングルクォーテーション
お恥ずかしい限りです。完全に抜けておりました。

>private staticの問題
ありがとうございます。
2回目のループの可能性に気づきませんでした。
$counterに操作を加えようと思います。

出先ですので帰宅後に修正いたします。
今後とも何卒よろしくお願いいたします。
ありがとうございました!!!

>プレフィックスの利用ができない不具合
ありがとうございます。採用させていただきました。

>文字列リテラルをあらわすシングルクォーテーション
_real_escapeメソッドを使うことにいたしました。
とはいえ初歩的なミスでお恥ずかしい限りです。
サニタイジングするものとしないものはDBのデータ型で判断しました。
ユーザ入力を受けないpluginということで油断していたかもしれないです。
以後、気をつけます。

>private staticの問題
JopGlobalBlogIndex::have_posts()がfalseを返す直前で
self::$counter = 0;
としました。

取り急ぎ御礼申し上げます!
ありがとうございました!!!

自分で言うのもなんですが、
ちょっとソースが美しくないので修正していきたいと思います。
あと、サブドメインの対応も是非実現させたいと思います。
今後とも何卒よろしくお願いいたします。

2.8.4aにヴァージョンアップしました

テンプレートファイルのhome.phpに

<?php while(JopGlobalBlogIndex::have_posts()):?>
<?php JopGlobalBlogIndex::the_post(); ?>
<div class=”item”>
<h3><a href=”<?php print(JopGlobalBlogIndex::the_permalink()); ?>” title=”<?php print(JopGlobalBlogIndex::the_title()); ?>”><?php print(JopGlobalBlogIndex::the_title()); ?></a></h3>
<p class=”item_category”>Category: <?php print(JopGlobalBlogIndex::the_category()); ?></p>
<?php print(JopGlobalBlogIndex::the_content()); ?>
<p class=”readmore”><a href=”<?php print(JopGlobalBlogIndex::the_permalink()); ?>” title=”<?php print(JopGlobalBlogIndex::the_title()); ?>”>Read More</a></p>
</div>
<?php endwhile; ?>

を書いても何も表示されません
サブドメインではなく、ディレクトリ型です
PHPのエラーメッセージ等はありません
宜しくお願いします

ご連絡ありがとうございます。

while(JopGlobalBlogIndex::have_posts())のループ後のコンテンツは表示されますでしょうか?

○される場合
データベースに記事が登録されていない可能性があります。
既に公開中の記事を編集し(特に変更は加えず)
「投稿を更新」のボタンを押して頂けますでしょうか?
するとトップページにそのアイテムが表示されるようにならないでしょうか?

○されない場合
PHPのエラー表示がされない設定になっている可能性があります。
wordpressのトップディレクトリのindex.htmlに

error_reporting(E_ALL ^ E_NOTICE);
ini_set(‘display_errors’, 1);

と記述することによりエラーが表示されるかと思います。

お手数をおかけしてすみませんが
よろしくお願いいたします。

「投稿を更新」のボタンを押せば表示されました…
過去の記事は表示できないのでしょうか?
可能であれば表示方法など、ご指導いただけませんか

お返事ありがとうございます。

「投稿を更新」のボタンを全部の記事で押すのも不便ですよね。
インストール時点で既に記事を
たくさん公開している場合がありますし。。。

実はWordPress MUはブログごとに
異なったテーブルにポストされる設計になってまして
このプラグインはテーブルを別に用意し
ポスト(更新含む)ごとにそちらのテーブルにも書き出す設計にしてます。
つまり現状では既に公開してある記事を
(更新ボタンを押さずに)登録しなおすプログラムを書いてません。
ホントに申し訳ないです。

ただ前述の場合はちょっと不便ですよね。。。
ちょっと変更できるか考えてみます。

ブログ数が多い手間ですが、一同WordPressのエクスポート機能でブログデータを出力して再度インポートを行えばプラグインが反応して反映されるのではないでしょうか。

ブログ数が多い為、その方法は困難です…スミマセン。

はじめまして。
大変素晴らしいコードを発表していただき、感謝しております。

1つお尋ねしたい点がありまして、コメントよりご連絡を差し上げた次第であります。

更新が行われた記事タイトルだけでは無く、ブログタイトル及び更新時刻を表示したいのですが、どのようなコードを挿入すれば良いでしょうか?

お時間がある時で結構ですので、お答えいただけますと幸いです。
よろしくお願いいたします。

>primen様
お問い合わせありがとうございます。

ループ内で以下のコードを使うと更新日時が表示されます。

<?php print(JopGlobalBlogIndex::the_time('Y/m/d H:i:s')); ?>

またループ内で以下のコードを使うと更新時刻が表示されます。

<?php print(JopGlobalBlogIndex::the_time('H:i:s')); ?>

今回、引数で時間表記方法を指定できるように0.1.5にバージョンアップしましたので宜しければ再度ダウンロードしてご利用ください。

記事中、「■使い方」の部分を追記しました。

>avalon 様
素晴らしいアイデアをありがとうございます。
インポートで確かに登録されました。

ちなみに、エクスポート後に全てのブログを一旦削除してから行わないとダメなようですね。

>素人 様
すみません。。。
アップグレード対応につきましては、もう少々お待ちください。
avalon 様から提案いただきました方法はいかがでしょうか?

>素人 様
お待たせしました。
version 0.1.6でインストール後に記事が表示されるように改良いたしました。

但し、バージョンアップの場合はアップグレード後(プラグインアップロード後)に
以下の2テーブルをDBから削除して頂きたく思います。
・(wp_)jop_global_posts
・(wp_)jop_global_term_relationships

するとインストール用のメソッドが実行され
既存の記事がプラグイン用のテーブルに登録されるかと思います。

念のため、作業前にデータベースのバックアップはとって下さい。
お手数ですが宜しくお願いいたします。
何か問題などありましたらお知らせください~

素晴らしいプラグインをありがとうございます!

タグなどの記述方法についてご教示いただきたいのですが、TOPページに表示される記事本文の文字数を制限するにはどうしたらよいでしょうか?

お時間あるときで構いませんので、何卒ご教示の程よろしくおねがいいたします。

コメントありがとうございます!!!

お待たせいたしました!
バージョン0.1.7で対応いたしました。
JopGlobalBlogIndex::the_content
で引数にtrueを指定すると
<!–more–>タグ以降が表示されなくなります。

デフォルトのWordPressのthe_contentタグとは
少しオプションが違いますがいかがでしょうか?

早速の対応ありがとうございます!!!
なんなく出来ました!本当にありがとうございます!!

あと、あくまでも先々の発展型での話ですが・・より実用性を考えると、特にユーザー数が増えてきた場合、「何文字程度でタグを挿入する」などルール化して一人ひとりに意識してもらわないといけなくなりそうなので、自動的に1記事あたり表示される文字数を制限できるのであれば最高なのかとも思いました・・・

機能追加していただいた矢先に、大変失礼なコメントをしてしまっているのではないかと恐縮しております。mm
もしお気に障られるような事があれば、無視してやってください。mm

どういたしまして!
使っていただけまして嬉しい限りです(^0^)

>自動的に1記事あたり表示される文字数を制限
ご意見ありがとうございます!
私見だけですと、なかなか良い物が出来ませんので
ご要望・ご意見は大歓迎です。

実は、(仕様について)どうしようか迷ってるんですが・・・
恐らくデフォルトのWordPressのthe_contentタグは文字数制限が出来なかったと思うんです。。。(但し、マルチユーザを考えるとあった方が便利でもありますよね)
文字数制限を指定するにはパラメータにデフォルトのタグには無いような記述を付加する必要がありまして…一方で、なるべく現行のタグと同じ使い勝手の方がプラグインユーザーの抵抗は少ないかなと。。。そこで

1.思い切って(オプションの順番や与え方を)デフォルトとは違うものにする
2.デフォルトタグと同じように、使えるので第4引数を使う

1番が個人的には良いかなと思ってるんですが、いかがでしょうか?

早速のご返答ありがとうございます。

>文字数制限を指定するにはパラメータにデフォルトのタグには無いような記述を付加する必要がありまして…一方で、なるべく現行のタグと同じ使い勝手の方がプラグインユーザーの抵抗は少ないかなと。。。

開発者としての葛藤、痛み入ります。開発者にしかわからない様々な引き合いのバランスというものが存在しているのですね・・・

私が思うに、そもそもこのプラグインはMUデフォルトに存在しない機能を追加しようとする試みだと思うので

>1.思い切って(オプションの順番や与え方を)デフォルトとは違うものにする

となっていくのは自然なことのように思います。

また、プラグイン利用の汎用性を考えると、1記事あたりに表示される文字数の制限というのは標準機能としてあった方が良いのではないかと考えます。というのは、ポータルTOPページの制約された範囲に、必要な情報を要約できるオールマイティーなプラグインに発展できるのではないかということです。

現在は新着記事での抽出となっていますが、例えば新着コメントでの抽出ができるようになれば、より活発な更新情報の抽出ができ、bbpressなどの大げさなプラグインは必要なく、コミュニティーサイトとしての色合いも大いに期待できるようになるかと思います。

wordpress MUをコアとした、ポータルサイト、コミュニティーサイト、SNS、検索サイト、などあらゆる大規模コンテンツのポータルTOPに、このプラグインの利用範囲は非常に広く持てるのではないかと、その先々の可能性を感じているのです。

また特定のカテゴリーやタグの範囲に限定して抽出するということが可能であれば、よりコアな話題のみを拾えるので、SNS的な色合いを持たせることもできるのではないかとも思います。

長々と理想論を語ってしまったわけですが・・・言うは易し、やるは難しとは、このことなのではないかと思います。あくまでも私の私見にすぎませんので、くれぐれもご自身のやりやすいように、気分が乗る方向で進めてください。m<_ _>m

ご無沙汰しております。
複数のブログIDをarray指定して、
尚且つ指定件数(5件とか)を取得するのってできないんでしょうかね・・・。
そうする事で表示させたくないブログとか回避できるかと思うのですが。
本家のfunction parse_query ($query)の中身を見たのですが、
どうもblog_idには触れておらずMU用の関数も無いようなので、
独自関数として実装してもらえたらうれしいです。

特定文字数だけの取得であれば下記のように一部を切り出すとかでも代用はきくかと思います。

echo mb_substr(strip_tags(get_the_content()), 0, 100);

ただし、mbstringが有効かつ文字コードを制御できないと文字化けなど起きるかと思います。

皆様コメントありがとうございます!!!
そしてなかなか返信できず、すみません。。。

>例えば新着コメントでの抽出
ありがとうございます。そうですね。いわゆる人気のある記事を表示できますしね。。。是非ともできるようにしたいですね!

>特定のカテゴリーやタグの範囲に限定して抽出する
なるほど。。。確かに。。。ちょっと他のよりも難しくなりそうですが欲しいですねー

>プラグイン利用の汎用性を考えると、1記事あたりに表示される文字数の制限というのは標準機能としてあった方が良い
>echo mb_substr(strip_tags(get_the_content()), 0, 100);
>mbstringが有効かつ文字コードを制御できない
JopGlobalBlogIndex::the_summary();などのメソッドを用意しJopGlobalBlogIndex::the_content();とは別にしようかと思ってます。理由は…
タグを除去するので(しない場合はロジックが複雑になる上に期待の表示が得られない可能性が)the_contentとはちょっと意味的に守備範囲が異なるかななんて思いまして…
&mbstringについてのご指摘ありがとうございます。

>複数のブログIDをarray指定して、
>尚且つ指定件数(5件とか)を取得するのってできないんでしょうかね・・・。
>そうする事で表示させたくないブログとか回避できるかと思うのですが。
ありがとうございます!そうですね。是非、実装したいと思います。
軽くDBとSQL見たところそんなに難しい事ではなさそうなので早々に対応いたしますー
ちなみに引数なんですがJSONですとPHPのバージョン等によって使えなくなってしまうので、文字列か配列か多次元配列(個人的には引数の順序によらないハッシュ形式で引数を与えるのが好きでして…)か迷ってます。。。

他には完全に趣味になりますがインスタンス化を防ごうかなとか考えてます。
サカキ様、avalon様、重ねて御礼申し上げます!

すみません。ちょっと関係ない話なんですが、wordpressのコメント欄で

function func(){}

などと記述するとハイライト表示できるなどのプラグインを御存じでしたら是非教えてください~

お世話になっております。
皆様お待たせいたしました!
version 0.1.8で以下の機能を付加いたしました♪

>1記事あたりに表示される文字数の制限
JopGlobalBlogIndex::the_summary((int) $limit);
新しくメソッドを作って対応しました。使い方は記事上部をご覧ください。

>複数のブログIDをarray指定して、尚且つ指定件数(5件とか)を取得する

while(JopGlobalBlogIndex::have_posts([int $limit = 5[, array $option = array('allowedId' => array(), 'restrictedId' => array())]])):

少し見にくいですが、ループコントロールの部分で制限をかけられるようにしました。
いかがでしょうか?

今後ともよろしくお願いいたします~

はじめまして。素敵なプラグインをありがとうございます!
原因はよくわからないのですが、私の使っているWPMUで、get_permalink()の中にあるget_option(‘home’)で取得されるURLが、なぜかその投稿のものと違うブログのURLになってしまうことがありました。
そこで、216行目を

$permalink = get_blog_permalink(self::$post->blog_id, self::$post->post_id);

こんなふうに書き換えてみたところ、動作がもとに戻りました。
ご参考になりましたら幸いです。

おひさしぶりです

jopGlobalBlogArchive0.1.3をWPMU2.7.1で利用させていただいてます。
問題なく動作しております。ありがとうごいます。

関係ない質問で恐縮なのですが・・・

サイトトップでjopGlobalBlogArchive0.1.3を利用していて、
サイドバーには検索窓を設置していました。
このサイトトップの検索窓から検索しても検索結果が表示されません。
子ブログからの検索は問題なく動作します。

いろいろ探したのですがWordPressMUトップページからすべての子ブログまで検索できるプラグイン等を見つけられずに苦心しています。

jopGlobalBlogArchiveがすべての子ブログの記事を並べられるように、すべての子ブログを検索できるような、WordPresMUトップページ用の検索プラグインができないものでしょうか?

無関係な質問で恐縮です。

はじめまして

最近になってはじめてWPMUを使用してCMSを構築することになったのですが、
jopGlobalBlogArchive0.1.8をWPMU2.8.3で使用させていただいてます。
とても便利で大活躍です。

トップで子ブログの新着記事を読み込むようにしたのですが、
パーマリンクの設定にpost_idを含めたところ、
jopGlobalBlogArchiveの吐き出すパーマリンクが
post_idではなく、IDになっていました。

211行目のIDをpost_idに変更したところ、
ちゃんとしたパーマリンクを吐き出すようになりました。

WP3.0Beta1でNetwork機能にチャレンジ中です。
この機能を探し求めて2週間あまり・・
いろんなプラグインを入れては試し、失敗し、
もうほとんど諦めていたのですが、
灯台もと暗しで、同じ日本人の方がこのようなプラグインを作って下さっていたのですね。
ちっとも気付きませんでした(涙)
おかげさまで、やっと自分のやりたい事が出来るようになりました。
本当にありがとうございました。

一つ、お聞きしたいのですが・・

$option[‘allowedId’] というのは、たとえばblog_ID 3の場合、
プラグインのPHPファイル内の記述を
$option[‘3’]のように書き換えるということでしょうか。

私もいまいちプログラムに疎いので、アドバイスいただければ幸いです。

よろしくお願いします。

>35
コメントありがとうございます!

<?php while(JopGlobalBlogIndex::have_posts(5, array('allowedId' => array(3, 5)))): ?>
<?php JopGlobalBlogIndex::the_post(); ?>

このようにするとIDが3と5のブログを許可できます。
ID3のブログだけを許可したい場合は以下のようになります。

<?php while(JopGlobalBlogIndex::have_posts(5, array('allowedId' => array(3)))): ?>
<?php JopGlobalBlogIndex::the_post(); ?>

・・・とそんな感じですが不具合や疑問点などありましたらお知らせください~

>33
貴重なご意見ありがとうございます!
確かに(子ブログを含む)サイト全体から検索出来た方が良いですよね!

次回のアップデートの際には頑張ってみたいと思います(・Θ・;)

>34,32
ご指摘ありがとうございます。非常に助かります!!!
取り急ぎ御礼申し上げます(o^o^o)

別途調査等して再度ご報告いたしますー

お返事ありがとうございます。
これで完璧にしたい表示できるようになりました。
本当に嬉しいです。
これからますますのパワーアップを期待しています(^^)

連投になってすみません

もう一つ、お聞きしたいのですが、子ブログに、「ID=1」の親ブログの新着記事を表示したい場合、
array (1) と記入するのですが、これが表示されません。

どういう風に記入すれば動作するでしょうか。

度々、お手数かけますが、よろしくお願いします。

はじめまして。
試行錯誤していた中で、こちらのサイトにたどり着きました!
とても分かりやすく、早速導入いたしました。
問題なく動いており、助かっております。

サムネイルを表示させることができたら、完璧だと思うのですが、
現状可能でしょうか?

ご検討の程よろしくお願いします!

現在chicappa上で、WordPress3を使用して複数のブログを持つサイトを作成しています。トップページに他のブログの内容が表示されません。
プリフィックスは wp1_ ですが、MySQL の中では、wpjop_global_posts,wpjopglobal_term_relationships が作成されています。init()内で wp1_ が wp にされているようです。
プリフィックスがwp1_のまま使用するようにしたところ、表示されるようになりました。
MySQL の中では、wp1_jop_global_posts,wp1_jop_global_term_relationships が出来ています。
lolipop の場合、プリフィックスが wp_ で、何もせずにそのまま表示されたのですが。MySQL 内でも、wp_jop_ となっています。 以上、ご報告。
なかなか良いものをありがとうございました。

RSS feed for comments on this post.TrackBack URL

Leave a comment