web-dev-qa-db-ja.com

wordpressのユーザー投稿を期限切れにする

私は分類されたWordPressテーマを作成しようとしています、そして私はユーザーの投稿が期限切れになるようにそして投稿にその日付を見せるようにする必要があります。ユーザーは、通常のWordPress投稿としてではなく、投稿タイプでの投稿の公開のみを許可されていました。

誰もが私がそれを作ることができる方法を知っていますか?

更新: /これまでのこの質問に対する回答によると、メタ投稿によって投稿タイプに有効期限を設定することは、30日の日付が欲しいとユーザーが変更できるようにすることです。投稿を公開した後、投稿は完全に削除され、管理者や作成者による手動ではなく、日付がバックエンドで自動的に投稿に追加されます。私の手段がもっと明確になってほしい。

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

4
Scott Wolter

有効期限を投稿メタ値として設定できます。 single.phpでは、投稿メタを照会することでその日付を簡単に表示できます。

update_post_meta() および get_post_meta() を参照してください。

さて、あなたの質問の第二部はかなりトリッキーです。私は2つの解決策を考えることができます。

  • Cron

どの投稿が期限切れになったのかを確認し、削除しないでdraft /に設定するために、wordpress cronを時間間隔で実行することができます。 wp_cron() を参照してください。

長所:

  1. 実装がとても簡単です。

短所:

  1. 誰もあなたのサイトにアクセスしていなければ、cronタスクは起動しません(頻繁なユーザーがいる忙しいサイトの場合、これは問題になりません)。

  2. 大量の投稿がある場合は、一定の間隔ですべての投稿を確認するとパフォーマンスが低下します。

  3. まったく信頼できません。指定された時間にポストが期限切れになることはありません。

(私はいつもwp_cron()を嫌っていて、自分では決して使っていません)

もう少し良いオプションはあなたのサーバーからcronタスクを使うことです。しかし、これでも時間間隔でcronを実行しなければならず、またパフォーマンス上のペナルティがあるため、正確な時間にポストの有効期限を保証することはできません。

  • Single.phpファイルを修正してクエリを投稿

私の考えではもっと良いオプションはあなたのsingle.phpでポストの有効期限をチェックし、expiration_dateをチェックするメッセージを表示することです。有効期限が過ぎてユーザーがこのページを最初に要求したときに、draftを削除または設定して、404でさらにアクセスすることもできます。

アーカイブページから期限切れのページを削除するには、 pre_get_post actionフックを使用して、投稿メタに基づいてクエリを変更します。

長所

  1. 正確な有効期限。
  2. やりたいことを完全に制御します。
  3. ごくわずかなパフォーマンスペナルティ。

短所:

  1. もう少し仕事を。

(利点を考慮すると、それほど多くの作業があるわけではありません。私があなたであれば、このオプションを選択します)

  • プラグインを使う

プラグインがたくさんあります これはまさにこれを行うようです。しかし、それらがどのように機能するのか、またはそれらがあなたの要求を満たすことができるのかどうかはわかりません。あなたはこれらを自分でチェックしなければなりません。

_編集_

私は分類されたWordPressテーマを作成しようとしています、そして私はユーザーの投稿が期限切れになるようにそして投稿にその日付を見せるようにする必要があります。ユーザーは、通常のWordPress投稿としてではなく、投稿タイプでの投稿の公開のみを許可されていました。

カスタム投稿タイプを作成するには、 register_post_type() を使用する必要があります。それらを分類したい場合は、カスタム分類法を作成する必要もあります。そのためには register_taxonomy() を使用してください。

また見なさい 分類学とカテゴリの間に違いがあるか。

これまでの質問に対する回答によれば、メタ投稿によって投稿タイプに有効期限を設定するのは私が望むものではないので、30日の日付(投稿を公開してから30日後)を変更できます。投稿は完全に削除され、日付は自動的にバックエンドの投稿に追加されます。手動では管理者や作成者に追加されません。

これはあなたが間違っていることです。ポストメタの保存はバックエンドでは行われません。どのように投稿メタを作成および更新するかはあなた次第です。あなたの場合は、 save_post actionフックを使用し、そこからexpire_dateを更新するのが最善です。サンプル例は

//This hook will fire when a post is created or updated.
add_action('save_post', 'set_expire_date_meta')

function set_expire_date_meta( $post_id ) {
    //We are checking if the saved post belongs to the CPT
    if( 'custom-post-type-name-that-you-registered' == get_post_type( $post_id ) ) {
        $meta = $get_post_meta($post_id, 'expire_date', true);
        //If the meta already exists, the post is being updated and we don't need to save the meta again
        if( $meta == '' ) {
            $timestamp_30day = strtotime("+1 month");
            update_post_meta( $post_id, 'expire_date', $timestamp_30day);
        }
    }
}

有効期限をカスタム投稿タイプにのみ有効にしたい場合は、メインクエリーがpost/pageなどの他の投稿タイプに対して変更されないように、remove_expired_post_from_main_query関数のis_post_type_archive( 'custom-post-type-name-that-you-registered' )のようなメインクエリーに追加条件を追加します。

expire_posts_to_404_redirectで、これらのカスタム投稿タイプのみが404になるようにis_single()is_singular('custom-post-type-name-that-you-registered')に変更します。

//This filter will show 404 page for expired posts for the cpt that you registered
add_filter('template_redirect', 'expire_posts_to_404_redirect' );
function expire_posts_to_404_redirect() {
    global $wp_query;
    global $post;

    if( is_singular('custom-post-type-name-that-you-registered') ) {
        $expire_date = get_post_meta($post->ID, 'expire_date', true);
        if( ($expire_date != '') && ($expire_date < time()) ) {
            $wp_query->set_404();
            status_header( 404 );
        }
    }
}

//This action will alter main query to remove expired posts from archive pages of the CPT that you registered
add_action('pre_get_posts', 'remove_expired_post_from_main_query');
function remove_expired_post_from_main_query($query) {
    if( $query->is_main_query() && !is_admin() && is_post_type_archive('custom-post-type-name-that-you-registered') ) {
        //We are comparing expiry date with current timestamp.
        //It will only keep the posts with expiry_date > current timestamp
        $meta_query = array(
            array(
                'key' => 'expire_date',
                'value' => time(),
                'compare' => '>'
            )
        );
        $query->set( 'meta_query', $meta_query );
    }
}

お役に立てれば。

6
sakibmoon