Shinichi Nishikawa's

ネットワークで子ブログに直接会員登録するプラグイン(ウィジェット付き)

概要

WordPressのネットワーク(マルチサイト)インストール時に、子ブログから「登録ボタン」を押すと、親ブログの登録画面に飛ばされてしまい、そのまま登録処理をすると、親ブログに登録されてしまい、子ブログには登録されません。

これでは不便なので、プラグインを作りました。

プラグインをインストールすると、子ブログへの直接登録をするためのリンクを出力するウィジェットが設置できるようになります。

ニッチなので、あんまり需要があるかどうか。。。メモということで。

ご質問・ご指摘などは、@shinichiNまでお願いします。

m(_ _)m

やっていること

子ブログの「登録」ボタンのリンク先は、もともとsubdomain.example.jp/wp-login.php?action=registerとなっています。
そして、ネットワークインストールの場合、example.jp/wp-signup.phpに転送されます。

この時に、親サイトに移動してしまっているので、登録リンクのリンク先をexample.jp/wp-signup.php?from_blog_id=(子ブログのID)に変更します。

ブログIDをGETで受け取ったら、wp-signup.phpでその値を持ち続けて、その子ブログに登録されるようにします。

ダウンロードとインストール

ダウンロードして(セキュリティが甘いので一旦止めて修正後UPします。→修正してUPしました。)解凍、wp-content/plugins/にアップして、管理画面から有効化してください。

管理画面はありません。

ウィジェットの設置と概要

「管理メニュー」という名前のウィジェットが追加されているので、サイドバーやフッターなどに追加してください。
このウィジェットでは、ログイン時には「ログアウト」「管理画面」リンクが、ログアウト時には「ログイン」「(ブログ名)に読者申請する」「新しいブログを作る」リンクが表示されます。
(「新しいブログを作る」は、ユーザに新規ブログ作成を許可している場合のみ)

サイトRSS、コメントRSS、WordPressサイトへのリンクはコメントアウトしているので、ソースを開いて外せば表示されます。

このウィジェットの「◯◯に読者申請する」リンクをクリックすると、読者申請用のURLに行きます。
サイト全体の設定で、ブログを作れるようにしていても、ブログかアカウントのみかを選ぶ選択肢が出なくなります。

そのままIDとメールアドレスを入力すると、有効化メールが飛び(ここは普通の動きですが)、有効化で登録が完了します。
この時、親ブログとリンクを踏んだ子ブログに同時に登録されます。

ソース

ウィジェット自体のソースは、wp-includes/default-widgets.phpにある、WP_Widget_Metaクラスをコピペしてカスタムしました。

/*****************************************
-------  メタ情報ウィジェットカスタマイズ --------
******************************************/

class Colog_Meta extends WP_Widget {

	function __construct() {
		$widget_ops = array('classname' => 'widget_meta', 'description' => __( "ログイン/ログアウト、管理画面へのリンクを表示します。") );
		parent::__construct('meta', __('管理メニュー'), $widget_ops);
	}

	function widget( $args, $instance ) {
		extract($args);
		$title = apply_filters('widget_title', empty($instance['title']) ? __('管理メニュー') : $instance['title'], $instance, $this->id_base);

		echo $before_widget;
		if ( $title )
			echo $before_title . $title . $after_title;
?>
			<ul>
			<?php if( is_user_logged_in() ) { ?>
				<li><a href="<?php bloginfo('url') ?>/wp-admin/">管理画面</a></li>
			<?php } ?>
			<li><?php wp_loginout(); ?></li>				
			<?php if ( !is_user_logged_in() ) {
	      		global $current_blog;
	      		$from_blog_id = $current_blog->blog_id; 
				$parent_blog_id = 1;
	      		$parent_blog_url = get_blog_option($parent_blog_id, 'siteurl');	  

	      		?>
				<li><a href="<?php echo network_home_url('wp-signup.php?from_blog_id=').$from_blog_id; ?>">「<?php bloginfo('name') ?>」に<br />読者申請する</a></li>
				<?php 
					if ( get_option('users_can_register') ) { ?>
						<li><a href="<?php echo network_home_url('wp-signup.php'); ?>">新しいブログを作る</a></li>
				<?php
					}
			 } ?>
<!--
			<li><a href="<?php bloginfo('rss2_url'); ?>" title="<?php echo esc_attr(__('Syndicate this site using RSS 2.0')); ?>"><?php _e('Entries <abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>
			<li><a href="<?php bloginfo('comments_rss2_url'); ?>" title="<?php echo esc_attr(__('The latest comments to all posts in RSS')); ?>"><?php _e('Comments <abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>
			<li><a href="http://wordpress.org/" title="<?php echo esc_attr(__('Powered by WordPress, state-of-the-art semantic personal publishing platform.')); ?>">WordPress.org</a></li>
-->
			<?php wp_meta(); ?>
			</ul>
<?php
		echo $after_widget;
	}

	function update( $new_instance, $old_instance ) {
		$instance = $old_instance;
		$instance['title'] = strip_tags($new_instance['title']);
		return $instance;
	}

	function form( $instance ) {
		$instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
		$title = strip_tags($instance['title']);
?>
			<p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label> <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></p>
<?php
	}
}
add_action('widgets_init', create_function('', 'return register_widget("Colog_Meta");'));


/*****************************************
------- 読者登録の場合には、
		  ブログ/読者選択肢を表示しない --------
******************************************/
function dr_active_signup_changer() {
	$from_blog_id = isset( $_GET['from_blog_id'] ) ? $_GET['from_blog_id'] : 'noflug';


//	echo $from_blog_id;
	$from_blog_name = get_blog_option($from_blog_id, 'blogname');
	echo '<h1>'.$from_blog_name.'に読者申請をする</h1>';
	global $active_signup;
	if ( $from_blog_id == '1' || $from_blog_id == 'noflug' ) {
		$active_signup = 'blog';
	} else {
		$active_signup = 'user';		
	}
}
add_action('signup_hidden_fields','dr_active_signup_changer');


/*****************************************
------- 子ブログに直接登録する --------
******************************************/
function add_to_from_blog(){
	$meta = array(
	"add_to_blog" => $_POST['from_blog_id'],
	"new_role" => 'Subscriber'
	);
	return $meta;
}
add_filter('add_signup_meta', 'add_to_from_blog');

function dr_add_blog_id_to_meta() {
	$meta = array(
	"add_to_blog" => $_GET['from_blog_id'],
	"new_role" => 'Subscriber'
	);
	return $meta;
}
add_filter("add_signup_meta","dr_add_blog_id_to_meta");

参考にしたサイト

子ブログへの直接登録のフローについて、@MakeGoodTimeさん子サイトにユーザを新規登録する方法という記事を参考にさせていただきました。

ウィジェットの作り方については、WordPress カスタムウィジェットの作り方というブログ記事を参考にしました。

その他

子ブログにいるときに、親サイトのURLを取得するときに使うコード。
なぜか、network_home_url()では、subdmain.example.jpが取得されてしまうので。。

$parent_blog_id = 1;
$parent_blog_url = get_blog_option($parent_blog_id, 'siteurl');
echo $parent_blog_url;

です。結果は、最後のスラッシュ無しのhttp://example.jpとなります。

すごく簡単なものですが時間かかりました・・・。

また勉強していろいろ作りたいと思います(今度はもっと需要のあるものを。。)

モバイルバージョンを終了