[ 質問者返信待ち ] 投稿リストブロックを使用した際に、カスタムフィールドの開催日を過ぎたら非表示にしたい

VWSとは フォーラム VK Blocks・Pro [ 質問者返信待ち ] 投稿リストブロックを使用した際に、カスタムフィールドの開催日を過ぎたら非表示にしたい

[ 質問者返信待ち ] 投稿リストブロックを使用した際に、カスタムフィールドの開催日を過ぎたら非表示にしたい

  • このトピックには5件の返信、3人の参加者があり、最後に石川@Vektor,Inc.により2年前に更新されました。
6件の投稿を表示中 - 1 - 6件目 (全6件中)
  • 投稿者
    投稿
  • #63697

    ■ WordPress のバージョン
    WordPress 5.9.2

    ■ テーマ・プラグインは全て最新版で確認してください。
    確認しました。

    ■ テーマの種類
    Lightning ( G3 ) + Lightning G3 Pro Unit

    ■ テーマのバージョン
    バージョン: 14.18.2

    ■ Pro Unit のバージョン
    バージョン 0.17.1

    ■ スキンの種類
    Evergreen

    ■ スキンのバージョン
    バージョン 0.1.5

    ■ 関連しそうなプラグインを一つづつ停止して症状が改善するか確認してください。
    確認しました。

    ■ 期待する動作
    定期的に講座を開催する予定で、トップページに現在開催中のイベントのみを表示させたいです。

    具体的には、カスタム投稿タイプとして「ワークショップ」を設定。
    プラグイン「Advanced Custom Fields」を使って、カスタム投稿タイプ「ワークショップ」に下記項目のカスタムフィールドを作成。
    ・ワークショップ名
    ・開催日
    ・開始時間
    ・終了時間
    ・説明

    このカスタム投稿タイプ「ワークショップ」をトップページ内で「投稿リストブロック」を使用して表示。
    そうすると全ての投稿内容が表示されてしまうので、カスタムフィールドの「開催日」が今日より前もものは非表示にしたいです。

    ■ 自分で試した事
    下記をfunctions.phpに記載したところ、archivesページでは非表示になりましたが、トップページの投稿リストブロックでは非表示になりません。

    /*——————————————-*/
    /* ワークショップカスタムフィールドの開催日を過ぎたら非表示
    /*——————————————-*/
    function posts_change_sort( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
    return;
    }

    $current_date = wp_date(“Ymd”);

    if ( $query->is_archive(‘workshop’) || $query->is_category()) {
    $query->set( ‘orderby’, ‘meta_value’ );
    $query->set( ‘meta_key’, ‘workshop_date’ );
    $query->set( ‘order’, ‘ASC’ );
    $query->set( ‘orderby’, ‘date’ );
    $query->set(‘meta_query’,
    array(
    array(
    ‘key’ => ‘workshop_date’, //カスタムフィールド名
    ‘value’ => $current_date,
    ‘compare’ => ‘>=’,
    ‘type’ => ‘DATE’
    )
    )
    );
    }
    }
    add_action( ‘pre_get_posts’, ‘posts_change_sort’ );

    ■ 症状が発生するブラウザ
    .

    ■ 実際の症状
    色々と調べてみたのですが、どうしてもわからずでお分かりになる方がいらっしゃいましたらご教授ください!


    該当URL : https://*********

    ※該当URLはフォーラムライセンスが有効のユーザーにのみ表示されます

    #63729

    ご質問の内容とちょっとずれますが…

    投稿リストには「今日以降」で日付を絞り込む機能があります。
    添付画像をご参照ください。

    公開日を開催日として運用するのが楽だと思います。

    ※カスタムフィールドで絞り込むやり方はわかりません。

    Attachments:
    You must be logged in to view attached files.
    #63762

    pre_get_posts はメインクエリを書き換えるフックで、
    投稿リストブロックは別途クエリを発行しているので pre_get_post で書き換える事はできません。

    方法としては、何かのトリガー(今書いてある条件分岐の中でも良いとは思います)で指定の日付を過ぎているかどうかを判断し、
    wp_update_post() 関数を使って該当の投稿の公開状態を 非表示か下書きに変更すると実現できると思いますが…。
    一度挑戦してみてください。

    https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_update_post

    試して上手くいかなかったらダメだったコードを貼り付けてまた質問してください。

    #63874

    ご教授いただきありがとうございます。
    wp_update_post() 関数を使ってみましたが、上手くいきませんでした。
    そもそもPHP自体の理解不足ですので、どこをどう直すのかがよく分かっておりません。
    よろしくお願いいたします。

    function my_expire_event($pid) {
       if (get_post_meta($pid, 'workshop_date', true) != ''
          && date_i18n('Y-m-d') < get_post_meta($pid, 'workshop_date', true)) {
          // 設定されていて未来の日付ならスケジュールをセット
          $time_stamp = strtotime(get_post_meta($pid, 'workshop_date', true) . ' JST');
          wp_schedule_single_event($time_stamp, 'my_new_event', array($pid));
       }
    }
    
    add_action('save_post','my_expire_event');
    
    // スケジュールされる動作を記述
    function my_update_post($pid) {
       wp_update_post(array( 'ID' => $pid, 'post_status' => 'draft' ) );
    }
    add_action('my_new_event', 'my_update_post');
    #63875

    返信ではなく、投稿をしてしまったようですので、再度返信という形で投稿させていただきます。

    ご教授いただきありがとうございます。
    wp_update_post() 関数を使ってみましたが、上手くいきませんでした。
    そもそもPHP自体の理解不足ですので、どこをどう直すのかがよく分かっておりません。
    よろしくお願いいたします。

    function my_expire_event($pid) {
       if (get_post_meta($pid, 'workshop_date', true) != ''
          && date_i18n('Y-m-d') < get_post_meta($pid, 'workshop_date', true)) {
          // 設定されていて未来の日付ならスケジュールをセット
          $time_stamp = strtotime(get_post_meta($pid, 'workshop_date', true) . ' JST');
          wp_schedule_single_event($time_stamp, 'my_new_event', array($pid));
       }
    }
    
    add_action('save_post','my_expire_event');
    
    // スケジュールされる動作を記述
    function my_update_post($pid) {
       wp_update_post(array( 'ID' => $pid, 'post_status' => 'draft' ) );
    }
    add_action('my_new_event', 'my_update_post');
    #63890

    とりあえず

    // スケジュールされる動作を記述
    function my_update_post($pid) {
       wp_update_post(array( 'ID' => $pid, 'post_status' => 'draft' ) );
    }
    add_action('my_new_event', 'my_update_post');

    は間違ってます。

    add_action( 実行する場所, 実行関数 );

    なので、自身で do_action(‘my_new_event’); をプログラムのどこかに配置したのでなければ、実行する場所が存在しないのでどこでも実行されません。

    アクションフックに関しては下記参照ください。

    できる!WordPressカスタマイズ #04 アクションフックを使ったカスタマイズに挑戦!

    そしてアクションフックで発火させた処理 my_update_post の中で、今日の日付が指定の日付を越えているか条件分岐して、合致していたら update を実行します。

    ※ この類の業務コードのサポートは公式なサポート対象外ですので、回答を保障するものではありません。
    お急ぎの場合は https://showcase.vektor-inc.co.jp/ などで対応できそうな開発者を探して発注もご検討ください。

6件の投稿を表示中 - 1 - 6件目 (全6件中)
  • このトピックに返信するにはログインが必要です。