web-dev-qa-db-ja.com

今後の日付付き投稿を公開済みとしてマークする

使用事例:

ミュージックショーに関連する投稿タイプがあります。 「上映時間」は、将来のある時間に設定されている公開後の日付から取得されます。将来の日付付きブログ投稿を受け取り、日付を残すが、その投稿を保存時に公開済みとしてマークする関数を見つけましたが、カスタム投稿タイプ用にカスタマイズする方法を考え出すことができませんでした。

機能は以下の通りです。

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post','show', '_future_post_hook');
        add_action('future_post', 'show', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Set new post's post_status to "publish" rather than "future."
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
12
curtismchale

MikeとJanの両方の答えを組み合わせて素晴らしいです。これは問題の投稿タイプでのみ機能します。 'future_show'フックはポストタイプのショーを取得してそれを更新するだけなので、条件付きショーは必要ありません。

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_show','_future_post_hook');
        add_action('future_show','publish_future_post_now');
    }

    function publish_future_post_now($id) {
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
6
curtismchale

私はあなたのサイトをテストする必要がないので私にはわかりませんが、私はあなたがremove_action()add_action()呼び出しから'show'を削除する必要があるだけだと思います。 wp_publish_post()関数は投稿タイプに関して不可知論です、少なくともそれはコードを読むことから現れるものです。それでこれを試してください:

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post', '_future_post_hook');
        add_action('future_post', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Set new post's post_status to "publish" rather than "future."
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>

もちろん、ショーだけに限定したい場合は、次のようなことをしたいと思うかもしれません(他の投稿タイプでも動作させる必要がある場合は、ロジックがもっと複​​雑になります)。

function publish_future_post_now($id) {
    $post = get_post($id);
    if ('show' == $post->post_type)
        wp_publish_post($id);
}

お役に立てれば?

6
MikeSchinkel

このアクションは wp_transition_post_status によって呼び出されると思います。コードは次のとおりです。

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

したがって、通常の将来の投稿では最後のフックはfuture_postになりますが、あなたの型ではfuture_showまたはあなたの型スラッグであれば何でも構いません。

3
Jan Fabry

あなたがしたいのが 'ショータイム'のために余分な日付を追加することだけであるなら、それを正確にするメタボックスを追加することはより簡単かもしれません将来の発行日で更新されるたびに「将来」のステータスになるので(私は思う)、投稿を更新するたびにフックして再び元に戻す必要があります。また、そのようにしてあなたはそれが意図されているもののために「発行日」を予約することができます。

私はおそらくmeta_keyとカスタムメタボックスを使うでしょう。それはあなたのクエリが投稿を表示することがどれほど複雑かによって異なります。

Meta_valueをタイムスタンプとして設定した場合は、まだショーの日時で並べ替えることも、特定の日付の前後に選択することもできます。

$events = get_posts( 'post_type=events&meta_key=show_time&meta_value=' . strtotime( '+1 week' ) . '&meta_compare=<&orderby=meta_value' );

現在の日付から1週間以内に上映時間を持つすべての "イベント"を取得するでしょう。注:上記はテストされていませんが、 should work :)

1
Joe Hoyle

WP Dev Nacinは単純な関数オーバーライドを使用します。

remove_action('future_post', '_future_post_hook');
add_filter( 'wp_insert_post_data', 'nacin_do_not_set_posts_to_future' );

function nacin_do_not_set_posts_to_future( $data ) {
    if ( $data['post_status'] == 'future' && $data['post_type'] == 'post' )
        $data['post_status'] = 'publish';
    return $data;
}
0
Adam David