サポート » 使い方全般 » 指定時間経過で投稿を非表示

  • 解決済 Ultra beginner

    (@ultra-beginner)


    こんにちは。
    自分なりに調べてみたのですが、どこが悪いのか分からないのでお助けください。

    カスタム投稿(NEWS)を1件だけサイドバーに表示させています。
    これを公開から指定時間が経過するとサイト上から非表示にさせようとしています。
    試しているコードは以下になります。

    <?php
    function filter_where($where = '') {
    	$where .= " AND post_date >= '" . date('Y-m-d', strtotime('+1 hours')) . "'";
    	return $where;
    }
    add_filter('posts_where', 'filter_where');
    $args = array(
    	'post_type' => 'news',
    	'posts_per_page'   => 1,
    );
    	$my_limit_post =  new WP_Query( $args );
    	remove_filter( 'posts_where', 'filter_where' );
    ?>
    
    <?php if($my_limit_post->have_posts()): while($my_limit_post->have_posts()) : $my_limit_post->the_post(); ?>
    
    	<a href="<?php the_permalink() ?>"><?php the_title() ?>/></a>
    
    <?php endwhile; ?>
    <?php endif; ?>
    <?php wp_reset_query(); ?>

    試験的に公開から1時間経過で非表示にするように設定しているつもりなのですが想定通りに動作しません。

    ローカル上で試験しているのですが、時刻を1時間強制的に早めてみてもそのまま表示されており、試した所16時間進めた時点で非表示になりました。
    日時は以下を埋め込んでサイト上で表示の確認を行っています。

    <p>現在時刻:<?php echo date_i18n("Y年n月j日 H:i:s"); ?></p>
    <p>公開日:<?php the_date("Y年n月j日 H:i:s") ?></p>

    で、よく分からないまま調べてfunctions.phpに以下を追記すると7時間進めて非表示になりました。

    date_default_timezone_set( 'Asia/Tokyo' );

    どこに問題があるのか分からないのですが、どうすれば指定時間通りに動作するのでしょうか。宜しくお願いします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター jim912

    (@jim912)

    指定されている条件が、

    date('Y-m-d', strtotime('+1 hours'))

    と、年月日までしか指定されていないため、時間単位での制御になっていません。
    おそらくではありますが、上記だと0時0分0秒として換算され、公開時刻にかかわらず日付が変わった時点にて非表示になっているのではないでしょうか。

    また、

    date_default_timezone_set( 'Asia/Tokyo' );

    は、WordPress本来の時刻環境を変えてしまうものであり、コア、プラグインなどの動作に影響を与えてしまう可能性がありますので、極力避けるべき実装です。

    必要な対応としては、2点あって

    1. filter_where での条件指定を時分秒まで加える
    2. strtotime(‘+1 hours’) を current_time( ‘timestamp’ ) + HOUR_IN_SECONDS に変更し、ローカル時刻でのタイムスタンプ計算にする

    になるかと思われます。

    トピック投稿者 Ultra beginner

    (@ultra-beginner)

    jim912様 ありがとうございます。
    ご助言通りに変更してみました。

    $where .= " AND post_date >= '" . date('Y-m-d H:i:s', current_time( 'timestamp' ) + HOUR_IN_SECONDS ) . "'";

    こうしました所、公開直後から表示されませんでした。
    試しにH:i:sを取り除くと表示されますが、時:59:59までは表示されますが、時:00:00で非表示になります。確かにこれはご助言通りの事なのですね。
    あと、10時間で非表示にしたい場合、調べた限りでは+ 10 * HOUR_IN_SECONDSと記せば良いようですが、こうした場合は公開直後から表示されませんでした。
    何か間違っているのでしょうか。
    宜しくお願いします。

    モデレーター jim912

    (@jim912)

    すみません、言われて気がつきました。
    条件を言い換えると、「10時間過去より新しく公開されたもののみ表示」ですから
    current_time + ではなく、current_time – で時間を遡らないとダメなはずですね。

    トピック投稿者 Ultra beginner

    (@ultra-beginner)

    jim912様 ありがとうございます。
    10時間で非表示にする場合

    $where .= " AND post_date >= '" . date('Y-m-d H:i:s', current_time( 'timestamp' ) - 2 * HOUR_IN_SECONDS ) . "'";

    こうする事でキッチリ公開から10時間で非表示になりました。
    試しに2時間、3時間等と試してみましたが希望通りになりました。
    長時間悩んでいただけにここまで完璧に動くと嬉しいです。
    この度は誠にありがとうございました。

    最後に今後、同様の事を行いたい方が居るかもしれませんのでまとめたものを記しておきます。

    <?php
    function filter_where($where = '') {
    	$where .= " AND post_date >= '" . date('Y-m-d H:i:s', current_time( 'timestamp' ) + 10 * HOUR_IN_SECONDS ) . "'"; //10時間で非表示
    	return $where;
    }
    add_filter('posts_where', 'filter_where');
    $args = array(
    	'post_type' => 'news', //投稿タイプ
    	'posts_per_page'   => 1, //表示件数
    );
    	$my_limit_post =  new WP_Query( $args );
    	remove_filter( 'posts_where', 'filter_where' );
    ?>
    
    <?php if($my_limit_post->have_posts()): while($my_limit_post->have_posts()): $my_limit_post->the_post(); ?>
    
    	<?php /* 表示方法は適宜修正 */ ?>
    	<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    
    <?php endwhile; ?>
    <?php endif; ?>
    <?php wp_reset_query(); ?>

    jim912様 ありがとうございました。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「指定時間経過で投稿を非表示」には新たに返信することはできません。