サポート » 使い方全般 » 一定期間の表示をカスタムフィールド値で行う方法

  • wordpressやphpは全くの初心者で申し訳ありませんが教えてください。

    プレゼントサイトなどに”もうすぐ締め切り”というコーナーがよくありますが、それと同じように、本日から1週間以内に締め切りになる投稿記事のみを表示させたいのですが、どうしたらよいのか分かりません。

      投稿記事のカスタムフィールドにはそれぞれ
       名前:締切日   値:2016/03/24
      のように入力してあります。

    いろいろネットで調べて
    functions.phpに

    global $my_where;

    function my_posts_where( $where ) {
    global $my_where;
    return $where . $my_where;
    }

    function my_query_posts( $query ) {
    global $wpdb, $my_where;

    $q = wp_parse_args( $query );
    $my_where = ”;

    if ( ! empty( $q[‘meta_key’] ) && ! empty( $q[‘meta_between’] ) ) {
    $dates = explode( ‘,’, $q[‘meta_between’] );
    if ( 2 == count( $dates ) ) {
    foreach( $dates as &$締切日 )
    if ( ‘TODAY’ == strtoupper( $締切日 ) )
    $締切日= date( ‘Y/m/d’ );

    $my_where = $wpdb->prepare( ” AND $wpdb->postmeta.meta_value BETWEEN %s AND %s “, $dates[0], $dates[1] );
    }
    }

    add_filter( ‘posts_where’, ‘my_posts_where’ );
    query_posts( $query );
    remove_filter( ‘posts_where’, ‘my_posts_where’ );
    }

    表示させたいところに

    <?php my_query_posts(‘meta_key=締切日&meta_between=today,2016/03/23&orderby=meta_value&order=ASC&posts_per_page=8&paged=’.$paged);?>

    と書いて表示させていますが、毎日 表示部分 の日付を更新しています。

    どうしたら自動で本日から1週間以内を表示できるようになるのか、教えて頂けると助かります。
    初心者ですみませんが、よろしくお願いいたします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • odan23さん
    私の場合の場合、こんな感じで設定してます。
    ↓カスタマイズしたソース抜粋です。

    おそらくなんですけど、date()で現在の日付を取得すれば良いのかなって思います。

    //newの表示プログラム
    //$new_post = '';
    $post_dsp = '';
    $set_days = 7;//NEWを表示日数
    $set_days = $set_days . day;//NEWを表示日数+単位
    $today = date('Y/m/d');//今日の日付を取得
    $limit_set_days = date("Y/m/d", strtotime($set_days, strtotime( date( $post_date )  )));//投稿日+$set_days
    
    //セットした日数より新しければ
    if( $limit_set_days > $today ) :
    
    表示したい内容
    
    endif;

    わたくしの場合、カレンダー1の日付〜カレンダー2の日付の間を表示させたかったので
    記事にpost_metaを開始と終了をもたせて、↓のように組んでます。
    参考程度に見てください。。。

    <?php //採用情報
    $args = '';
    $post_type = get_post_type_object( 'recruit' );//投稿タイプ = お知らせ
    $posttype_slug = esc_html($post_type->name); //カスタムポストタイプのスラッグ取得
    $posttype_labels = $post_type->labels;
    $posttype_name = esc_html($posttype_labels->name); //カスタムポストタイプの表示名
    $posttype_singular_name = esc_html($posttype_labels->singular_name ); //カスタムポストタイプの表示名
    $posttype_menu_name = esc_html($posttype_labels->menu_name ); //カスタムポストタイプの表示名
    $posttype_desc = esc_html($post_type->description); //カスタムポストタイプの説明文
    $posttype_link = esc_url(get_post_type_archive_link($posttype_slug));
    
    $args = array(
    'numberposts' => 5,  //表示(取得)する記事の数
    'post_type' => array( $posttype_slug) , //投稿タイプの指定
    //'orderby' => 'modified',//更新日順
    'post_status' => 'publish',
    'has_password' => false,//false or true
    );
    if ( have_posts( $args ) ) ://条件に合致した投稿があった時
    $customPosts = get_posts($args);//$argsの条件取得
    if($customPosts) :
    echo '<h3 class="headline1" title="' .$posttype_singular_name.'|'.$posttype_desc. '">' . $posttype_singular_name . '</h3>' . PHP_EOL;
    echo '<ul class="front-postlist">'.PHP_EOL;
    
    foreach($customPosts as $post)://フォーイーチで繰り返しの開始
    setup_postdata( $post );//お決まり
    
    //↓記事開始
    //タイトルの正規表示及びXSS対処
    $title = get_the_title();//記事タイトル取得
    $title = preg_replace('!<style.*?>.*?</style.*?>!is', '', $title);//スタイル無効
    $title = preg_replace('!<script.*?>.*?</script.*?>!is', '', $title);//スクリプト無効
    $title = strip_tags($title);//タグ削除
    $title = mb_ereg_replace('&nbsp;', '', $title);//全角スペース削除
    $title = mb_strimwidth (strip_tags($title), 0 , 50, "…", "utf-8");//表示文字数
    $title = esc_html($title);//最終書き出し
    //文章の正規表示及びXSS対処
    $post_text = get_the_excerpt();//概要文取得
    $post_text = preg_replace('!<style.*?>.*?</style.*?>!is', '', $post_text);//CSS無効
    $post_text = preg_replace('!<script.*?>.*?</script.*?>!is', '', $post_text);//JS無効
    $post_text = strip_tags($post_text);//タグ削除
    $post_text = mb_ereg_replace('&nbsp;', '', $post_text);//全角スペース削除
    $post_text = mb_strimwidth (strip_tags($post_text), 0 , 50, "…", "utf-8");//文字数制限
    $post_text = esc_html($post_text);//ESC処理
    //ID取得
    $post_id = get_the_ID();
    //パーマリンク
    $post_link = get_permalink( );
    $post_link = esc_html($post_link);
    $post_link = esc_url($post_link);
    $post_link = urldecode($post_link);
    $domain = esc_html( esc_url("http://www." . $_SERVER['HTTP_HOST'] ) );//現在のドメインを取得
    
    $post_date = $post->post_date;//投稿日
    $post_modified = $post->post_modified;//更新日
    $post_status = $post->post_status;//公開状態 ( publish | pending | draft | private | static | object | attachment | inherit | future )
    $post_password  = $post->post_password;//投稿パスワード
    $post_cat = get_the_category();//カテゴリー
    
    //newの表示プログラム
    //$new_post = '';
    $$post_dsp = '';
    $set_days = 7;//NEWを表示日数
    $set_days = $set_days . day;//NEWを表示日数+単位
    $set_dsp_days = 30 ;//記事を表示日数
    $today = date('Y/m/d');//今日の日付を取得
    $limit_set_days = date("Y/m/d", strtotime($set_days, strtotime( date( $post_date )  )));//投稿日+$set_days
    //更新の表示プログラム
    //$modified_post = '';
    $post_dsp = '';
    $set_modified_days = 7;//を表示日数
    $set_modified_days = $set_modified_days . day;//NEWを表示日数+単位
    $set_modified_dsp_days = 30 ;//記事を表示日数
    $limit_modified_set_days = date("Y/m/d", strtotime($set_modified_days, strtotime( date( $post_modified )  )));//投稿日+$set_days
    //セットした日数より新しければ新着マークを表示
    if( $limit_set_days > $today ) :
    $post_dsp ='<span>new</span>';
    elseif( $limit_modified_set_days > $today ) :
    $post_dsp ='<span>更新</span>';
    endif;
    
    /***********************************/
    /*** 記事にタイマーを持たせるPHP ***/
    
    //値をリセット
    $start_day = '';
    $end_day = '';
    $dsp_start = '';
    $dsp_end = '';
    $dsp_day = '';
    
    //日時設定
    //表示startの日付を取得
    if(get_field('start-day')) :
    $start_day = date('Y-m-d 0:00:00' , strtotime( date( get_field('start-day') )  ));
    endif;//END 開始日を取得できたとき
    //表示ENDの日付を取得
    if(get_field('end-day')) :
    $end_day = date('Y-m-d 23:59:59' , strtotime( date( get_field('end-day')) ));
    endif;//END 終了日が取得できたとき
    
    //現在の日時を取得
    $now = date('Y-m-d H:i:s', strtotime(date('Y/m/d H:i:s')));
    
    //開示時刻が現在より過去 又は未設定で1を加算
    if( ! $start_day ) :
    $dsp_start = true;
    elseif( $now > $start_day ) :
    $dsp_start = true;
    else :
    $dsp_start = '';
    endif;
    //終了時刻が現在より先 又は未設定で1を加算
    if( ! $end_day ) :
    $dsp_end = true;
    elseif( $now < $end_day ) :
    $dsp_end = true;
    else :
    $dsp_end = '';
    endif;
    //開始+終了のポイントを加算
    
    echo '<p>'.$now.'</p>'.PHP_EOL;
    echo '<p>'.$start_day.'</p>'.PHP_EOL;
    echo '<p>'.$end_day.'</p>'.PHP_EOL;
    if( $dsp_start && $dsp_end ) ://開始・終了がそれぞれ加算されたときのみ表示
    
    /***************************/
    ?>
    <li>
    <article itemscope="itemscope" itemtype="http://schema.org/Article" title="<?php echo $title; ?>">
     <meta itemprop="description" content="<?php echo $post_text; ?>" />
     <link itemprop="author" href="<?php echo $domain; ?>" />
      <time datetime="<?php echo get_post_time('Y-m-j') ?>">
      <?php echo get_post_time('Y-m-j') ?>
      </time>
      <h1 itemprop="name">
        <a itemprop="url" href="<?php echo $post_link; ?>"><?php echo $title; ?></a><?php if($post_dsp) : echo $post_dsp . PHP_EOL; endif; ?>
      </h1>
    </article>
    </li>
    <?php
    else:
    //非表示処理
    endif;//記事にタイマーを待たせる
    
    //END 記事
    endforeach;//繰返し終了
    echo '</ul>'.PHP_EOL;
    wp_reset_postdata(); //クエリのリセット
    
    endif;
    endif;//have_posts( $args )
    ?>
    トピック投稿者 jodan23

    (@jodan23)

    mura0403さん、ありがとうございます。

    すみません。初心者なもので。
    理解するのに時間がかかりそうです。少し、時間を頂ければ助かります。

    jodan23さん

    本日の日付の部分に
    $today = date('Y/m/d');//今日の日付を取得
    を利用できないでしょうか。

    締め切り日を設定するカスタムフィールドを’end_date’として、フォーマットが『YYYY/MM/DD』の場合、

    $date = new DateTime();
    
    // 今日の日付
    $start = $date->format('Y/m/d');
    
    // +7日
    $date->add(new DateInterval('P7D'));
    
    $end = $date->format('Y/m/d');
    
    $between_posts = query_posts(array(
    	'posts_per_page' => 8,
    	'orderby' => 'meta_value',
    	'order' => 'ASC',
    	'paged' => $paged,
    	'meta_query' => array(
    		array(
    			'key' => 'end_date',
    			'value' => array( $start, $end ),
    			'compare' => 'BETWEEN',
    			'type' => 'DATE'
    		)
    	)
    ));

    とすればカスタムフィールドに指定された特定の範囲の投稿を取得できるかと思います。

    今日の場合は『2016/03/18』~『2016/03/25』の投稿を取得します。

    注意する点は実際の範囲が8日間であるということでしょうか。

    DateIntervalに渡すパラメータで日付を調整できますので色々ためしてみるといいかと思います。

    トピック投稿者 jodan23

    (@jodan23)

    みなさん、本当にありがとうございます。
    いろいろ試してみましたが、うまくいきません。

    実のところ、みなさんの記載してあることが初心者で理解できていないのが
    本当のところです。

    どの記載をこのphpに記載するのかまで教えて頂けると助かります。
    お手数をお掛けするお願いですがよろしくお願いいたします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • トピック「一定期間の表示をカスタムフィールド値で行う方法」には新たに返信することはできません。