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

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

ただいまの
回答率

90.23%

Wordpress記事数をユーザー登録を行った日から 経過した日数に応じて可変させたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 1,103

hirororo

score 58

はじめまして!

以前、こちらのサイトで質問させて頂いてからあともう少しで完成するところまで進むことが出来ました。

改めて質問させて下さい。

プログラミング初心者で、ある塾のWordpressサイトを運営しています。

取引先で期限付きでサイト作成を依頼され、期限内に必ず達成させたいという思いで書かせて頂きます。

早速なのですが、

Wordpresサイトで会員登録のプラグイン(WP_Menbership)を導入した後、phpとsqlでユーザー登録を行った日から経過した日数に応じた数の記事を閲覧できるプログラムを作るにはどう取り組めばいいでしょうか?

出来れば、毎日自動で2記事を更新出来るように設定したいと考えています。

例えば、AさんとBさんがいたとします。

Aさんは、新規会員登録して、まだ初日なので、2記事だけ見れる
(2記事以外は画面に表示されず隠れた状態) 

一方Bさんは新規会員登録してから、10日経ったので、22記事を閲覧できる

と言ったシステムを導入したいのです。

■試してみたこと

XEORY extensionというテーマの中の
front.phpファイルを編集することで

5記事表示→3記事表示

に変更することができました。

データベースとテーブルの名の確認はできています。

▷考えてみたPHP文

$time1 = $current_user->user_registered;

$time2 = date("Y/m/d H:i:s", strtotime('0 day'));

$seconddiff = abs($time2 - $time1);

$diff = $seconddiff / (60 * 60 * 24);

$daydiff = floor($diff) + 1;

▷補足 

$time1を

$time1 = $current_user->user_registered;と入力するとページエラーが出てしまうのですが、

$time1 = date("Y/m/d H:i:s", strtotime('-1 day'));
このように変えることで、プログラムは機能していました。

▷わからないこと

SQLのデータベースから呼び出せるログインユーザーIDが分からない状況です。

▷使っている会員サイトを作るためのワードプレスプラグイン
・WP_Menbership

主に、新規会員登録ページとログインページを作るためのプラグインです。

今も尚、調べてますが数週間調べても解決に至らず、ご教授して頂ければ幸いです。

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • miyabi-sun

    2016/05/22 08:27

    読みづらいです。フッターにあるヘルプリンクからMarkdownのフォーマットが乗っていますので、PHPのコード部分だけでも```で括ってほしいです。

    キャンセル

  • kei344

    2016/05/22 09:41

    文章の途中の改行を減らしてください。読点のたびに改行するのは読みにくいです。

    キャンセル

  • miyabi-sun

    2016/05/22 17:44

    修正ありがとうございます。

    キャンセル

回答 2

checkベストアンサー

+3

$current_user->user_registered;よりも前に$current_user = wp_get_current_user();が記載されていないようなら追加してみてください。
日本語Codex クラスリファレンス/WP User
日本語Codex 関数リファレンス/get userdata
ユーザー関連の情報を取得するのはこのあたりが参考になりそうです、WPの関数classを調べるならまずはcodexをあたってみましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/24 02:21 編集

    アドバイスありがとうございいます!

    送っていただいたサイトを参考にさせていただきます!

    $current_user->user_registered;よりも前に
    $current_user = wp_get_current_user();を追加してみました。

    ▷変更後のソース

    ```lang-php

    $current_user = wp_get_current_user();

    $time1 = $current_user->user_registered;


    $time2 = date("Y/m/d H:i:s", strtotime('0 day'));

    $seconddiff = abs($time2 - $time1);

    $diff = $seconddiff / (60*60*24);

    $daydiff = floor($diff) + 1;

    ```

    ページエラーは出なくなり記事は表示されるようになりましたが、次の問題が発生しました。


    登録日が現在のユーザーと10日前のユーザーの記事が同じ数で表示されてしまいます。


    ex)
    登録日が異なるユーザーAとユーザーBの表示される記事数

    ユーザーA: 2016/05/11 00:00:00 1記事
    ユーザーB: 2016/05/01 00:00:00 1記事


    そこで試してみたことを以下に並べてみます。


    ■試してみたこと

    $daydiffの演算を変更

    ex)

    変更前
    $daydiff = floor($diff) + 1; //(ユーザーAとBともに)表示される記事数1

    変更後
    $daydiff = floor($diff) + 2 //(ユーザーAとBともに)表示される記事数2

    変更後
    $daydiff = floor($diff) * 2 //(ユーザーAとBともに)表示される記事数10

    になりました。


    考えられる原因として、、

    ・計算式に問題がある

    ・データベースからユーザー登録日の情報を受け取れてない

    と仮設して取り組んでいます、


    ワードプレスコーデックなどで調べてみましたが未だに解決策を模索中です。


    アドバイス頂けると幸いです。
    よろしくお願いいたします。

    キャンセル

  • 2016/05/24 05:33

    hirororoさんがまずすべきなのはvar_dump($current_user->user_registered);だと思います。
    また計算結果をみて仮設を立てるのではなく$time1,$time2,$seconddiff,$diffの各値をvar_dumpして具体的にどういった内容になっているのか確認したほうがいいと思います。

    キャンセル

  • 2016/05/24 10:49

    横から失礼します。
    $current_user->user_registeredに値が入っていると仮定して、
    $time1 = $current_user->user_registered;
    $time2 = date("Y/m/d H:i:s", strtotime('0 day'));
    はどちらも文字列です。
    miyabi-sunさんの書かれているように、
    $time1 = strtotime( $current_user->user_registered );
    $time2 = time();
    とすれば秒数が採れると思います。

    キャンセル

  • 2016/05/24 18:53

    おかげで無事、プログラムを機能させることに成功しました!

    詳しいアドバイスをしていただき、ありがとうございます!

    こちらが機能することに成功したプログラムになります。

    $current_user = wp_get_current_user();

    $time1 = strtotime($current_user->user_registered);

    $time2 = strtotime(date('Y/m/d H:i:s'));

    $seconddiff = abs($time2 - $time1);

    $diff = $seconddiff / (60*60*24);

    $daydiff = floor($diff) + 1;


    まだ、一点問題が残っているのですが、今回の質問と少し違ったものになるため改めて質問させて頂きます。

    キャンセル

+2

私はWPはあまり知らないので、日付の取得に関してはサポートできません。
経過日数の計算回りに限って回答します。

$time1 = $current_user->user_registered;
$time2 = date("Y/m/d H:i:s", strtotime('0 day'));
$seconddiff = abs($time2 - $time1);
$diff = $seconddiff / (60 * 60 * 24);
$daydiff = floor($diff) + 1;

$current_user->user_registeredは文字列ではないですか?
$time2 = date("Y/m/d H:i:s", strtotime('0 day'))は一目瞭然で文字列です。
その後$seconddiff = abs($time2 - $time1);で登録後の経過秒数を確認したいのだと思われますが…

$ php -a
Interactive shell

php > $hoge = "2016-05-22 8:42";
php > $piko = "2014-03-14 16:16:17";
php > echo $hoge - $piko;
2 // 日付のセパレートがスラッシュ(/)だったとしても同じ結果

結果はご覧の通り2になります。
理由は公式サイトの文字列の数値への変換を読んでください。
これではいくら頑張っても経過年数しか取れない訳です。

ここで役に立つのがstrtotime関数です。
この関数を使うと全ての日付っぽい文字列は1970/1/1からの経過秒数となります。
後はこれを計算してやれば良いだけですね。

php > $hoge = "2016-05-22 8:42";
php > $piko = "2014-03-14 16:16:17";
php > echo strtotime($hoge);
1463906520

php > echo strtotime($piko);
1394813777

最後に2行目ですが、ユーザーが作成した日付$time1は「過去」であり、変動はしません。
$time2は今である必要があります。
今を返す関数はtime()です。

php > echo time();
1463875209

上記を踏まえて頑張ってみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/24 02:23 編集

    アドバイスありがとうございいます!

    アドバイスを元に、変更したら無事動きました!
    他の問題も発生しましたが^^;


    変更後のソースはこちらになりました。


    ```lang-php

    $current_user = wp_get_current_user();

    $time1 = $current_user->user_registered;


    $time2 = date("Y/m/d H:i:s", strtotime('0 day'));

    $seconddiff = abs($time2 - $time1);

    $diff = $seconddiff / (60*60*24);

    $daydiff = floor($diff) + 1;

    キャンセル

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

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる