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

概要

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となります。

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

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

↓ プラグインを作る方々への本、書きました。 ↓

“ネットワークで子ブログに直接会員登録するプラグイン(ウィジェット付き)” への 9 件のフィードバック

  1. なかなか興味深いプラグインなのですが、細かい点で問題があるようです。

    * 「管理画面」の URL は get_admin_url() で取得してください。使い方は link-template.php 参照で。
    * network_home_url() の出力も esc_attr() してから echo した方が無難だと思います。
    * __() の中に日本語 (ローカライズ文字列) を入れるのはほとんど意味がありません (将来的言語リソースとして分離する予定なのでしょうが)。
    * $_GET, $_POST が生で使われている部分が気になりますがこれは値を渡す先の add_signup_meta() の処理がどうなっているかに依存しますね。intval() などでバリデートした方が無難でしょう。

    以上、コードを精査されることをおすすめします。

  2. お世話になります!
    記事に書かれている通りその通りのことがしたくて、プラグインを導入させていただきましたが、登録時に以下のURLになってしまいました。

    http://mydomain/wp-signup.php?from_blog_id=1

    その次のページでは「ユーザー登録は無効化されました。」と表示され、会員登録が出来ませんでした。
    なにか事例や解決策等ございませんかね?

  3. ジェームズさん、こんにちは。

    このプラグインは、子サイトのブログ画面上から、子サイトのみに会員登録するためのものですが、そのような使い方をされてますでしょうか?

    from_blog_idが1になってしまうところをみると、親ブログにウィジェットを設置しているように思うのですが、いかがでしょうか?

    また、会員登録が無効化されているというメッセージは、見たことがないのですが、もしかしたら、会員登録をネットワークが許可していないためかもしれませんが、いかがでしょうか?

  4. nskw様

    詳しくご説明いただきましてありがとうございます。
    やはりおっしゃられた通りのようです。

    親ブログから親ブログの会員になので、使えるのかなぁ。。。
    ということで入れさせていただいたのですが、やはり難しいでしょうか。

    親から親にも出来るようにするにはどのような修正が必要になるのでしょうか?

  5. こんばんは。

    さっそく使わせていただいたところ、
    無事子ブログの方に登録できました。
    素晴らしい!

    ところで、西川様がWPのフォーラムの方で質問されていたように、
    登録を直接ではなく、認証制にしたくてプラグインを試しまくってみたんですが、
    今のところ、結果が出るものが見当たりません。
    フォーラムの方でも回答がないようなので、やはり難しいのでしょうか?

  6. こんにちは。お役に立てたようでよかったです。

    認証制にする、という僕の質問のURLを教えて下さい。忘れてしまいました・・・。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です