Subscribe2 カスタマイズなど

今日は、かれこれ5年以上お世話になっているWordPressプラグイン Subscribe2 について。

無料版は残念ながらもうサポートされないようなので、サーバーやWPなど諸々の変化に伴い必要なところだけ修正しつつ使い続けています。

以前から更新しながら使っていると気づかずにいたので、そのメモも兼ねて。

プラグイン独自のオプション変数

最近新規でインストールすると、過去のアップデートで追加されたオプション変数が登録されず、
PHP Notice: Undefined index: dismiss_sender_warning
がでます。

現象としては、インストール後初めて有効化した状態では、サイト管理者メールアドレス(WP設定→一般設定のメールアドレス)がサイトと異なるドメインの場合に

messageYou appear to be sending notifications from (メールアドレス), which has a different domain name than your blog server (サイトのドメイン). This may result in failed emails.

というメッセージが表示されません。
※サイトがサブドメインであればok。

Subscribe2→Settings→Email Settings のSend Email Fromをサイト(blogname)以外の送信者を選択して一度保存すれば、オプションdismiss_sender_warningも作成されPHP Noticeはでなくなります。
これ以降は、サイト管理者が別のドメインメールでも、きちんとwarningメッセージが表示されるようになります。

※MySQL : options テーブルで確認。

SQL例SELECT * FROM `wp_options` WHERE `option_name` = "subscribe2_options"

ユーザープロフィール画面での購読/購読解除設定

Subscribe2→Settings→Registered Usersタブ→Auto-SubscribeのShow one-click subscription on profile page:を「Yes」にすると、ユーザープロフィール画面でメール通知を受け取るかどうかを自身で設定できるようになるのですが、チェックしてもしなくてもUnsbscribe(購読しない)設定になってしまう不具合を解消します。

$_POSTの数字文字列を===で比較しているので、intにキャストするか、あるいは、==で比較するようにします。

subscribe2/classes/class-s2-admin.php LINE 895 ~ 901//if ( isset( $_POST['sub2-one-click-subscribe'] ) && 1 === $_POST['sub2-one-click-subscribe'] ) {
if ( isset( $_POST['sub2-one-click-subscribe'] ) && 1 === (int)$_POST['sub2-one-click-subscribe'] ) { // @@@変更
あるいは
if ( isset( $_POST['sub2-one-click-subscribe'] ) && 1 == $_POST['sub2-one-click-subscribe'] ) { // @@@変更

// Subscribe
$this->one_click_handler( $user_ID, 'subscribe' );
} else {
// Unsubscribe
$this->one_click_handler( $user_ID, 'unsubscribe' );
}

※バージョン10.28では1128行目~
※バージョン10.30.1では1135行目~(2019.9.25更新)
※バージョン10.32では1147行目~(2020.3.2更新)
※バージョン10.33も同じ1147行目~(2020.6.7更新)
※バージョン10.34も同じ1147行目~(2020.8.25更新)

購読者一括操作ページでの購読者表示数

Subscribe2→Subscribers→Registered Subscribers ページで、現在の購読ユーザーや各カテゴリー毎の購読ユーザーを確認できます。

Subscribe2→Settings→Registered Usersタブ→Compulsory Categoriesでカテゴリーを設定していると、購読ユーザーにはデフォルトで通知されますので、全ユーザー数を表示するロジックになっています。
ユーザープロフィールやSubscribersページで個別に解除しても、プルダウンの表示人数には反映されません。
そこで、実際に送信される人数を表示するように変更してみます。

変更前subscribe2/classes/class-s2-admin.php LINE 487 ~ 507// get subscribers to individual categories but only if we are using per-post notifications
if ( 'never' === $this->subscribe2_options['email_freq'] ) {
$compulsory = explode( ',', $this->subscribe2_options['compulsory'] );
if ( $this->s2_mu ) {
foreach ( $all_cats as $cat ) {
if ( in_array( $cat->term_id, $compulsory ) ) {
$count[ $cat->name ] = $count['all_users'];
} else {
$count[ $cat->name ] = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(a.meta_key) FROM $wpdb->usermeta AS a INNER JOIN $wpdb->usermeta AS b ON a.user_id = b.user_id WHERE a.meta_key='" . $wpdb->prefix . "capabilities' AND b.meta_key=%s", $this->get_usermeta_keyname( 's2_cat' ) . $cat->term_id ) );
}
}
} else {
foreach ( $all_cats as $cat ) {
if ( in_array( $cat->term_id, $compulsory ) ) {
$count[ $cat->name ] = $count['all_users'];
} else {
$count[ $cat->name ] = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(meta_value) FROM $wpdb->usermeta WHERE meta_key=%s", $this->get_usermeta_keyname( 's2_cat' ) . $cat->term_id ) );
}
}
}
}

$compulsory = explode( ',', $this->subscribe2_options['compulsory'] );

$compulsory = array();
にするだけでも結果的にはokかと。
*
意味合い的に対応するならこちら。$compulsoryに関わらず、DBからカウント取得するようにします。

変更前// get subscribers to individual categories but only if we are using per-post notifications
if ( 'never' === $this->subscribe2_options['email_freq'] ) {
if ( $this->s2_mu ) {
foreach ( $all_cats as $cat ) {
$count[ $cat->name ] = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(a.meta_key) FROM $wpdb->usermeta AS a INNER JOIN $wpdb->usermeta AS b ON a.user_id = b.user_id WHERE a.meta_key='" . $wpdb->prefix . "capabilities' AND b.meta_key=%s", $this->get_usermeta_keyname( 's2_cat' ) . $cat->term_id ) );
}
} else {
foreach ( $all_cats as $cat ) {
$count[ $cat->name ] = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(meta_value) FROM $wpdb->usermeta WHERE meta_key=%s", $this->get_usermeta_keyname( 's2_cat' ) . $cat->term_id ) );
}
}
}

※ユーザープロフィール画面等で個別に購読解除しても、Your Notification Settingsページにはデフォルトカテゴリーにチェックされているままなので、ユーザーにはメール通知されそうな気がしますが、実際はメール送信されません。

テキストメールがHTMLメール形式(text/html)で送信されるのを修正

HTMLメール受信者の後に送信されるテキストメールが改行されず、ギュッと詰まった文章で送られる現象があります。

原因は、wp_mailで送信する際、HTMLメール送信時にwp_mail_content_typeフィルターフックでHTMLメール形式に切り替えますが、そのままになっているためです。
送信後、このフィルターフックをremoveフィルターしても、テキストメールにうまく切り替わりませんでしたので、フィルターを削除しました。

変更前subscribe2/classes/class-s2-core.php LINE 133//変更前
add_filter( 'wp_mail_content_type', array( $this, 'html_email' ) );

//変更後
//@削除@ add_filter( 'wp_mail_content_type', array( $this, 'html_email' ) );

もともと
Content-Type: text/html; charset=UTF-8

Content-Type: text/plain; charset=UTF-8
をheaderにセットしていますので、こちらだけでOKのようです。

一般購読者にもHTMLメールを送る

WPユーザ購読者ではなく一般購読者には、選択肢がなく無条件で「抜粋テキストメール」が送信されます。
これを「HTMLメール」に変更するには、こちら。

変更前subscribe2/classes/class-s2-core.php LINE 574 - 576// and finally we send to Public Subscribers
$recipients = apply_filters( 's2_send_public_subscribers', $public, $post->ID );
$this->mail( $recipients, $subject, $plain_excerpt_body, 'text' );
変更後// and finally we send to Public Subscribers
$recipients = apply_filters( 's2_send_public_subscribers', $public, $post->ID );
$this->mail( $recipients, $subject, $html_body, 'html' );//HTMLメール(フル)

■抜粋版
//HTMLメール(抜粋)
$this->mail( $recipients, $subject, $html_excerpt_body, 'html' );
//テキストメール(抜粋)
$this->mail($recipients, $subject, $plain_excerpt_body);

■フル版
//HTMLメール(フル)
$this->mail( $recipients, $subject, $html_body, 'html' );
//テキストメール(フル)
$this->mail($recipients, $subject, $plain_body);

通知設定メタボックスの設置

以前はカスタム投稿を追加する際に、編集ページに通知設定メタボックスも追加する処理を自力で追加しなければなりませんでした。
いつからか(だいぶ前)、これは対応され s2_post_types にフックしてカスタム投稿を追加するとメタボックスも追加されるようになっています。
※メタボックス追加のコールバック関数も新設されました。

※追加したカスタム投稿は、メタボックス設置を変更できます。
例)カスタム投稿member追加

カスタム投稿追加add_filter( 's2_post_types', function( $types ){
$types[] = 'member';
return $types;
} );

member投稿編集画面 sideの一番上 にメタボックス配置add_action( 'admin_menu', function(){
global $mysubscribe2;
add_meta_box('subscribe2', 'メール通知設定', array(&$mysubscribe2, 's2_override_meta'), 'member', 'side', 'high' );
} );

アンインストール

「PHP Notice: Undefined variable:」をなくすために、変数宣言追加
※「//@@@追加」部分

uninstall.php LINE 11~// Is this WordPressMU or not?
global $wp_version, $wpmu_version;//@@@追加
$s2_mu = false;//@@@追加
if ( isset( $wpmu_version ) || strpos( $wp_version, 'wordpress-mu' ) ) {
$s2_mu = true;
}
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
$s2_mu = true;
}

One thought on “Subscribe2 カスタマイズなど

コメントを残す

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