質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

794閲覧

WordPressでpendingユーザを指定時間に削除する方法

hotaruika

総合スコア57

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/08/30 08:28

編集2019/09/02 13:45

###実現したいこと
WordPressで、「指定時間経過後にpending状態のユーザを削除する機能」を実装したいです。

###ユーザを登録するコード
以下、ユーザを登録するコードで、特に問題なく機能しています。

まず$name$mailを受け取り、仮登録(pending)状態でユーザを登録します。

そしてwp_mail()でパスワード設定メールのリンクを送信し、そのリンクから本登録が完了するという流れです。

この流れの最後で// 指定時間経過後にユーザを削除するのがいいのではと思っていまして、その削除イベントを登録しているのがmy_pending_del_activation()になります。

// Ajaxでユーザ登録します add_action( 'wp_ajax_nopriv_my_ajax_register', 'my_ajax_register' ); function my_ajax_register() { $name = isset( $_POST['name'] ) ? $_POST['name'] : ''; $mail = isset( $_POST['mail'] ) ? $_POST['mail'] : ''; $userdata = array( 'user_login' => $name, 'user_email' => $mail, 'user_pass' => 'toriaezu_pass' ); $user_id = wp_insert_user( $userdata ); // ユーザーの作成失敗 if ( is_wp_error( $user_id ) ) { } // 成功 else{ // パスワード設定メールを送信 $subject = '仮登録完了'; $html = '<a>ここ</a>をクリックしてパスワードを設定してください'; wp_mail( $mail, $subject, $html ); // 指定時間経過後にユーザを削除 my_pending_del_activation( $user_id, time() ); } }

###ユーザを削除するコード
次に肝心の削除の方です。

上のmy_pending_del_activation()ですが、pendingが1日以上たったとき、そのユーザに対してwp_delete_user()するイベントを登録する。という内容にすべきかと思っています。

そのイベントがmy_pending_del()です。

そこで質問になりまして、削除対象の$user_idはいったいどうやって渡せばいいのでしょうか?

my_pending_del_activation()からmy_pending_del()へいくにはmy_daily_eventを通さねばならず、そのときに$user_idを渡す方法がわからない状況です。(というか、それができれば無事削除できるでしょうか?)

// イベントの登録 add_action( 'wp', 'my_pending_del_activation' ); function my_pending_del_activation( $user_id, $register_time ) { if( ! wp_next_scheduled( 'my_daily_event' ) ) { wp_schedule_event( $register_time , 'daily', 'my_daily_event' ) } } // 1日経過してもpendingのユーザを削除します add_action( 'my_daily_event', 'my_pending_del' ); function my_pending_del( $user_id ) { wp_delete_user( $user_id ); }

以上は素人ながらの実装方法なので、他の実装方法や注意点なども併せてご教授願えましたらと思い質問を立てさせて頂きました。

どなたかご協力宜しくお願い致します。

###補足
kei344様より削除関数など教えていただき、上記の「ユーザを削除するコード」を、下記のように変更しました。

後述の画像の通り、イベントの登録はできたように思えます。

// イベントの登録 wp_schedule_single_event( strtotime( '+60 min', time() ), 'my_pending_del_activation', array($user_id) ); // 1日経過してもpendingのユーザを削除します function my_pending_del( $user_id){ // ユーザ削除 require_once( ABSPATH.'wp-admin/includes/user.php' ); // TAMA...様のアドバイスにより require_once を追記 wp_delete_user( $user_id ); // ユーザ削除以外のイベントが実行されるかどうかテスト $report = $user_id.'を削除しました'; update_user_meta( '1', 'my_pending_del_report', $report ); } add_action('my_pending_del_activation','my_pending_del');

上のイベントの登録は次のとおり、「WP Crontrol」(イベント管理プラグイン)によって確認されます。
イメージ説明

ですが、画像のようにイベントは登録できているはずなのに、実際にwp_delete_user()update_user_meta()は発生しないという状況です。(サイトへのアクセスは発生しています。)

自力でこれ以上先に進むのが難しいのですが、ご助力願えませんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/02 13:40

本来ならこちらに書くべきでした。失礼しました。
退会済みユーザー

退会済みユーザー

2019/09/02 13:50

で、$u_idを$user_idに変えてみては?それで実行されなければ$user_idに値があるかvar_dumpで確認しましょう。
hotaruika

2019/09/03 00:45 編集

TAMAKINKAIKAI様、ご指摘ありがとうございます。以下、kei344様のご回答へのコメント欄でのやりとりを含めて返答させて頂きます。 >無ければエラーを吐きます。 有無を比較しましたが、下記のように同様のエラーでした。まぁなんにせよ必須ということで、書いておきます。 ・ない場合のエラー [02-Sep-2019 13:54:15 UTC] PHP Fatal error: Uncaught TypeError: Argument 1 passed to my_pending_del1() must be an instance of  , integer given, called in /export/user/b/zjp_42h22r/live_848958/var/wordpress/wp-includes/class-wp-hook.php on line 286 and defined in /export/user/b/zjp_42h22r/live_848958/var/wordpress/wp-content/themes/right/functions.php:411 ・ある場合のエラー [02-Sep-2019 14:07:51 UTC] PHP Fatal error: Uncaught TypeError: Argument 1 passed to my_pending_del2() must be an instance of  , integer given, called in /export/user/b/zjp_42h22r/live_848958/var/wordpress/wp-includes/class-wp-hook.php on line 286 and defined in /export/user/b/zjp_42h22r/live_848958/var/wordpress/wp-content/themes/right/functions.php:411 >$u_id >全角 失礼しました。いずれもタイポです。質問文直しました。 >値が渡せているのか疑問 >$user_idに値があるかvar_dumpで確認しましょう。 すみません、今回のケースでは var_dump の結果ってどこに出力されますか?ふつうならsingle.phpでvar_dumpすれば記事ページに結果が出力されますが、このイベントには出力されるHTMLがないので、どこに出力されるのかわからないです。
guest

回答2

0

回答にします。

まずwp_delete_userの実行にはrequire_once( ABSPATH.'wp-admin/includes/user.php' );が必須です。

ブラウザーで見れないエラーはWP_DEBUG_LOGを使うと確認し易いです。

動いていないからエラーが出ないのか定かでないですが、実際に本当に正しく動くのか$user_idに実在する値を指定すると良いです。

$user_idに値があるかvar_dumpでブラウザーで見れないならファイル出力すれば良いです。
『var_dump ファイル出力』などで検索してください。

ところでpendingユーザとは、『ユーザー自身がユーザー登録作業をしたが当該ユーザーが任意のパスワードを設定していないユーザー』というものでしょうか?

投稿2019/09/03 09:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

wp_schedule_event の第4引数にパラメータを渡せるようです。

【wp_schedule_event – WordPress私的マニュアル】
https://elearn.jp/wpman/function/wp_schedule_event.html

【wp_schedule_event() | Function | WordPress Developer Resources】← 例が載ってます
https://developer.wordpress.org/reference/functions/wp_schedule_event/

投稿2019/08/30 08:48

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotaruika

2019/08/30 09:19

情報どうもありがとうございます!コードの流れとしては問題なさそうでしょうか?第4パラメータは後程試させて頂きます。 あとこれは違う質問で申し訳ございませんが、ユーザーランキングトップの方ということでもしご存じでしたら教えてください。 wp_insert_user() を使うとき user_pass が空だとエラーになってしまうので、質問のコードでは「toriaezu_pass」の値を入れています。 そしてデフォルトの登録機能ではユーザはパスワードを入力しませんよね。このデフォルトの場合ですと、user_pass には何の値が入っているのでしょうか?空だとエラーになるので何かの値が入っているのだと思うのですが…
kei344

2019/08/30 09:43

すみませんが特に知りません。気になるようでしたら、コードを追うことが一番の近道だと思います。(「デフォルトの登録機能」の表示部分とかから実際に値を追加しているコードまでを追って、というような感じです) ただ、下記コードを見たところ特にエラーになるように見えなかったため、別の原因かもしれません。 エラー文を確認してみてください。(エラー文の文面のあるコードを確認したらどういう処理を通っているかが探せると思います) 【wp_insert_user() | Function | WordPress Developer Resources】 https://developer.wordpress.org/reference/functions/wp_insert_user/
hotaruika

2019/08/30 11:26 編集

エラー原因さぐってみます。ありがとうございます。 ところで本旨ですが、よく考えたら第4パラメータから $user_id を渡せたとしても、my_daily_event で、どのユーザのイベントの名前も同じになってしまいますよね…。下記「// ←ここ」の名前です。 // イベントの登録 add_action( 'wp', 'my_pending_del_activation' ); function my_pending_del_activation( $user_id, $register_time ) { $hook = 'my_daily_event '.$user_id; if( ! wp_next_scheduled( 'my_daily_event' ) ) { wp_schedule_event( $register_time , 'hourly', $hook , $user_id ); } } // 1日経過してもpendingのユーザを削除します add_action( 'my_daily_event ', 'my_pending_del' ); // ←ここ! function my_pending_del( $user_id ) { wp_delete_user( $user_id); } 上の my_pending_del_activation() の方では $user_id を使って $hook の名前を分けていますが、 下の my_pending_del() の方では「// ←ここ」の名前を分けられず…。 つまりAさんの件でBさんを削除してしまう羽目になってしまいそうですが、これは解決できますでしょうか?
hotaruika

2019/08/30 22:06

こうでしょうか? // イベントの登録 add_action( 'wp', 'my_pending_del_activation' ); function my_pending_del_activation( $user_id, $register_time ) { $hook = 'my_daily_event'; $args = [$user_id]; if( ! wp_next_scheduled( 'my_daily_event' ) ) { wp_schedule_event( $register_time , 'hourly', $hook , $args ); } } // 1日経過してもpendingのユーザを削除します wp_schedule_event( 'my_daily_event ', 'my_pending_del' ); function my_pending_del( $user_id ) { wp_delete_user( $user_id); } しかし $hook に $user_id を付けてユーザごとのイベントを分けないと、Aさんの登録で my_daily_event が追加され、Bさんの登録でも同じ my_daily_event が追加されてしまい、Aさんのイベントが削除されてしまうのでは? あとこれ、$register_time もおかしいですよね?これだと1時間後ではなく即座に実行されてしまういそうです。僭越ながら長くはないと思うので、もしよろしければ口頭でなくコードでお見せいただけましたら…。
kei344

2019/08/31 07:50

【wp_schedule_single_event – WordPress私的マニュアル】 https://elearn.jp/wpman/function/wp_schedule_single_event.html 定期イベントではなく1つずつのイベント登録はこっちでした、すみません。また、手元に検証できる環境が用意できないため、すみませんが特にコードは書くつもりがありません。 wp_ajax_nopriv_my_ajax_register 内で wp_schedule_single_event でアクションを登録、そのアクションを引数つきで拾って処理、という流れになると思います。
hotaruika

2019/08/31 08:28

いえありがとうございます。情報参考にさせていただきます。
hotaruika

2019/09/02 12:30 編集

お世話になっております。 あれから調べてイベントの登録はできました。 しかしその登録されたイベントが発生しないという状況です。 質問にコードと画像を補足しましたので、もしお時間ございましたらご助力願えましたら幸いです。
kei344

2019/09/02 13:13

「今すぐ実行」を押しても実行されないのでしょうか。
hotaruika

2019/09/02 16:14 編集

はい、「今すぐ実行」をクリックした場合してもダメです。または指定時間になった場合は画像のイベントがなくなりますので実行できたものだと思ったのですがやはりダメです。いずれもユーザは削除されず、user_metaも変化ない状態です…。
hotaruika

2019/09/02 13:33

TAMA…様、情報どうもありがとうございます。そちら試しましたが、効果なしでした。 そもそも wp_delete_user と一緒に書いてある update_user_meta も処理されていないので、my_pending_del() の実行に何か問題がありそうです。
退会済みユーザー

退会済みユーザー

2019/09/02 13:38

試しましたが、効果なし ではなく必須なので、無ければエラーを吐きます。 疑問なのは$user_idと書いてあるのに使用しているのは$u_id、そもそもタイポだとしても$u_id等に値が渡せているのか疑問ですが。 また、コード内に全角スペースが入っています。通常ならばエラーになりますが。
hotaruika

2019/09/02 13:53

TAMA…様、お返事は「質問への追記・修正、ベストアンサー選択の依頼」に記載致します。よろしくお願い致します。
hotaruika

2019/09/02 16:15 編集

kei344様の方では他に妙案ございませんでしょうか…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問