サポート » 使い方全般 » ショートコード内に変数を展開したい。[Easy Timer]

  • 解決済 Thirdwind

    (@thirdwind)


    お世話になります、初投稿です。
    至らぬ事がございましたらおっしゃってください。

    [Easy Timer]プラグインをつかって予定時間までカウントダウンを行い予定時間になったら文で知らせると言う事を実施したいのです。

    しかし、ショートコード内に変数を展開するのに手間取っております。
    実行したいショートコードは[Easy Timer]プラグインの物です。
    元となるショートコードが以下の物です。

    [countdown date=2013/01/01-00:00]
    予定時間まであと [mtimer]
    [after]予定時間になりました[/countdown]

    これの予定時間を投稿ごとに取得したいのでphp文で実行出来るよう以下のように書きました。
    予定時間の取得は[カスタムフィールドテンプレート]プラグインを使っています。
    php文は[カスタムフィールドテンプレート]プラグインの[cft]Shortcode Formatに入れています。

    <?php
    	$machiji= '[待時間時]'; //カスタムフィールドより待時間(時)を取得
    	$machifun= '[待時間分]'; //カスタムフィールドより待時間(分)を取得
    	echo '待時間' . "には「{$machiji}:{$machifun}」と代入されています。";
    
    	$local_timestamp = current_time( 'timestamp' ); // ローカルのタイムスタンプ
    	$local_date = gmdate( 'Y/m/d', $local_timestamp ); // ローカルの時刻文字列
    
    	echo '$local_date' . "には「{$local_date}」と代入されています。";//変数確認
    	$settime = $local_date."-".$machiji.":".$machifun;//日付に時間を結合
    	$text_to_shortcode_1 = "予定時間まであと";
    	$text_to_shortcode_2 = "予定時間になりました";
    	echo '$settime' . "には「{$settime}」と代入されています。";//変数確認
    
    	echo do_shortcode('[countdown date=$settime]'.$text_to_shortcode_1.'[mtimer]'.'[after]'.$text_to_shortcode_2.'[/countdown]');
    ?>

    変数確認で変数の取得、代入や結合がうまくいっているのを確認しています。

    $settimeに実数ex.[2013/01/01-00:00]を入れると機能しますが変数のままだと機能しません。
    現状では予定時間になっていないのに予定時間になっているように動いています。

    変数展開に問題があると思うのですが、どなたか教えていただけますと幸いです。

    同じ機能が使えれば[Easy Timer]プラグインでなくてもOKなので別の方法でもわかる方がいらっしゃいましたらよろしくお願いいたします。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック投稿者 Thirdwind

    (@thirdwind)

    ちなみに最後の行を

    echo do_shortcode('[countdown date={$settime}]'.$text_to_shortcode_1.'[mtimer]'.'[after]'.$text_to_shortcode_2.'[/countdown]');

    としても駄目でした。

    echo do_shortcode('[countdown date=2013/01/01-00:00]'.$text_to_shortcode_1.'[mtimer]'.'[after]'.$text_to_shortcode_2.'[/countdown]');

    これだと動くんですが…。

    echo do_shortcode('[countdown date={$settime}]'.
    の部分を
    echo do_shortcode('[countdown date='.$settime.']'.
    でどうですか?

    トピック投稿者 Thirdwind

    (@thirdwind)

    早速の返信ありがとうございます。
    試してみましたがやはり機能していないです。

    トピック投稿者 Thirdwind

    (@thirdwind)

    根本的な解決になっていないような気がしますが、以下のようにコードを書くと機能しました。

    $setshortcode = "[countdown date=".$settime."]";//ショートコードの開始タグを変数に代入
    echo  $setshortcode;
    echo do_shortcode('待時間[mtimer][after] 予定時間です[/countdown]');//ショートコードのオプション終了タグを記入

    こんなんで大丈夫なんでしょうか?(^▽^;)
    気になるのはショートコード開始タグをdo_shortcodeで始めてないところ。
    そもそもこういう使い方はOKなんでしょうか?

    現在の時間に待ち時間の時間と分を加えた時刻をカウントダウンの終了時刻とするのでしたら、相対的な指定も可能なので、次のようにしてみてはいかがでしょうか?
     
    http://www.kleor-editions.com/easy-timer/en/#part3.6

    3.6 Relative Dates

    It is possible to specify a relative date for the date attribute, like this:

    [countdown date=+d:h:m:s]
    Just [timer]![after]Countdown ended!
    [/countdown]

    d = number of days
    h = number of hours
    m = number of minutes
    s = number of seconds

    In some cases, you can specify the duration differently:

    +d is equivalent to +d:0:0:0
    +d:h is equivalent to +d:h:0:0
    +d:h:m is equivalent to +d:h:m:0

     

    $machiji= '[待時間時]'; //カスタムフィールドより待時間(時)を取得
    	$machifun= '[待時間分]'; //カスタムフィールドより待時間(分)を取得
    	echo '待時間' . "には「{$machiji}:{$machifun}」と代入されています。";
    	$waith = $machiji ? $machiji : 0;
    	$waitm = $machifun ? $machifun : 0;
    
    	$text_to_shortcode_1 = "予定時間まであと";
    	$text_to_shortcode_2 = "予定時間になりました";
    
    	echo do_shortcode('[countdown date=+0:'. $waith .':' . $waitm .']'.$text_to_shortcode_1.'[mstimer]'.'[after]'.$text_to_shortcode_2.'[/countdown]');

    トピック投稿者 Thirdwind

    (@thirdwind)

    返信ありがとうございます。
    試してみましたがやはりショートコード開始タグ内に変数が展開できていないようで機能しません。
    変数を実数にすれば機能しています。

    私の方法でもすべて変数の取得や代入結合等はうまくいっていますので、最後のショートコード内に展開する部分の問題だと素人ながら推測しています。

    引き続きご指導頂ければと思います。
    必要な情報が書かれていない等ございましたらご指摘ください。

    よろしくお願いします。

    待ち時間の変数への代入も問題ないのですね?(表示確認部分できちんと表示される。)

    $machiji= '[待時間時]'; //カスタムフィールドより待時間(時)を取得
    	$machifun= '[待時間分]'; //カスタムフィールドより待時間(分)を取得
    	echo '待時間' . "には「{$machiji}:{$machifun}」と代入されています。";

     
    変数が展開されているかどうかは、生成されたショートコードを表示確認してみてください。
     

    echo '[countdown date=+0:'. $waith .':' . $waitm .']'.$text_to_shortcode_1.'[mstimer]'.'[after]'.$text_to_shortcode_2.'[/countdown]';

     
    Relative Dates(相対的な日付)によるカウントダウンの場合、タイマーを設置した投稿またはページへの初回アクセス日時のタイムスタンプをクッキーに保存して利用しています。
    first-visit-[投稿またはページID]というクッキーがあったら削除してから確認してください。

    トピック投稿者 Thirdwind

    (@thirdwind)

    何度もありがとうございます。

    今回のコードのようにechoでショートコードを始めるとショートコードが表示されずに実行されて機能してしまいます。変数は展開されているという事です。
    私自身も変数が展開されているかを表示させようとしてショートコードが実行されてしまう事に気づきました。

    前にも書きましたがこういう使い方はOKなのでしょうか?
    問題ないならこれで私の方は解決なんです(^▽^;)

    do_shortcodeを入れると予定時間になっていないのになっているように動いてしまいます。変数は展開されているのかもしれませんが機能しないです。
    変数部分を実数に直すと機能するので変数展開の問題、括弧やクォーテーションのくくり方かなぁ?と勝手に思っていました。

    クッキーはfirst-visit-[投稿またはページID]を見つけられなかったので同一ドメインのクッキーを削除してテストしました。

    こんな質問にも暖かく返信いただき改めて感謝いたします。
    正直こんなにはやく活発に返信を頂けるなんて思っていませんでした。
    wordpressもphpもまだまだ勉強中ですので、勘違いや失礼があるかもしれませんがよろしくお願いいたします。

    確認していませんでしたが、上記のコードはテンプレート(~.php)ファイルに記述していますか?
    いろいろな部分をカスタマイズしているのでしょうか?
    通常は echo するだけでは実行されないので、現在の動作状態にしているコードを見つけて、動作を把握しておくのがいいと思います。
    本体をカスタマイズする人もいると思いますが、動作の変更をするコードは、大体はテーマのfunctions.phpに記述しているようです。
    Twenty ElevenでもTwenty Tenでもどちらでもいいのですが、カスタマイズしていない標準のテーマで、通常時の動作を確認してみてください。

    もう一つ、カウントダウンタイマーの利用目的についてですが、ページを更新(再読み込み)する度に[現在の時間+待ち時間]から再度カウントダウン開始になっても問題ないのでしょうか?
    ページへの初回アクセス日時から待ち時間までなど、特定の日時から待ち時間までのカウントダウンを、ページ更新(再読み込み)の影響を受けずに行いたい場合は、Easy Timerの機能(Relative Datesによる指定)を利用した方がいいです。
    初回アクセス日時ではなく、待機することを了承した時間から待ち時間までとしたい場合は、ボタンか何かを設置し、押されたタイミングでEasy TimerがRelative Dates使用時に発行しているクッキーfirst-visit-[ID]を書き換えるだけで済みます。

    もう一つ書き忘れていました。
    Thirdwindさんのコードでは、日付が[ローカル日付+”-“+”待ち時間”+”:”+”待ち時間(分)”]となっています。
     

    $settime = $local_date."-".$machiji.":".$machifun;//日付に時間を結合

     
    例えば、日付が[2012/5/27]、待ち時間が[6]時間、待ち時間(分)が[10]分の場合、現在時刻に関わらずカウントダウン日時には[2012/05/27-6:10]がセットされてしまいます。
    現在時刻が6:10分より前の場合はカウントダウンされますが、6:10分を超えている場合は、何時であっても[予定時間になりました]が表示されるのではないかと思います。
     
    カウントダウンタイマー設置の目的によって、方法を決める必要がありますが、もしRelative Datesではなく、日時を直接セットする場合は、上記の問題がありますので、カウントダウン日時を決める部分を変更する必要があります。

    トピック投稿者 Thirdwind

    (@thirdwind)

    日付の部分は運用の問題で、ショートコードが実行されないこととあまり関係ないと思い書き込みませんでしたが、現在は予定時間には予定日付と予定時刻を取得するように変更しています。

    書き込み不足でしたら申し訳ないです。

    トピック投稿者 Thirdwind

    (@thirdwind)

    整理しますが最初の投稿に書いてある通り、

    [countdown date=2013/01/01-00:00]
    予定時間まであと [mtimer]
    [after]予定時間になりました[/countdown]

    このショートコードの予定時間を投稿ごとに取得して変数に入れて実行したいのです。
    ターゲットとなる予定時間までカウントダウンして予定時間になったら文章を表示する。

    ページを読み込むたびにカウントダウンが最初から始まるのは困りますので、予定時間を投稿ごとに設定するためにプラグイン「カスタムテンプレートフィールド」を利用

    予定時間の時と分を取得、(現在は日付を超えた場合を考えて予定日付も取得)

    php分はプラグイン「カスタムテンプレートフィールド」のShortcode Formatに入れて各投稿ではそれを呼び出すショートコードで表示させています。

    ショートコードが入れ子になっているのが問題なのでしょうか?

    だからechoだけでショートコードが実行されてしまうのかもしれません。

    現状ではechoで始める事によってショートコードが機能しているので私自身はOKなのですがどうも気持ちが悪いので、、、。

    しつこいですが、変数の取得はうまくいっています。
    ショートコードに変数をセットすると予定時間が過ぎた動作をします。
    変数の取得、代入、結合を事前にechoで確認しています。
    そのechoされた変数をショートコードに数字で入れると機能しています。
    ショートコード開始タグを echo のみでdo_shortcodeを入れないと機能しています。

    カスタムテンプレートフィールドプラグインのShortcode Formatに記述しているのが原因です。
    ちゃんとソースを読んではいませんが、ここにショートコードを記述した場合、do_shortcode()で実行して出力しているようです。
    ですので、この欄ではdo_shortcode()を記述する必要はありません。
    次のように記述すると動作すると思います。
     

    <?php
    /* ここに日付やメッセージを変数に代入するPHPのコード */
    ?>
    [countdown date=<?php echo $settime ?>]<?php echo $text_to_shortcode_1 ?>[mstimer][after]<?php echo $text_to_shortcode_2 ?>[/countdown]

     
    間違って途中で送信したので追記しています。

    トピック投稿者 Thirdwind

    (@thirdwind)

    どうもいろいろとありがとうございました。

    おかげでスッキリしました。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック「ショートコード内に変数を展開したい。[Easy Timer]」には新たに返信することはできません。