将来の日付の投稿を公開済みとしてマークする


13

使用事例:

音楽番組に関連する投稿タイプがあります。「表示時間」は、将来のある時間に設定された公開後の日付を介して取得されます。将来の日付のブログ投稿を受け取り、日付を残す機能を見つけましたが、保存時に公開済みとしてマークしますが、カスタム投稿タイプ用にカスタマイズする方法を理解できませんでした。

機能は以下のとおりです。

<?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');
?>

1
あなたがあなたの電話にエラーがある可能性はremove_actionありadd_actionますか?2番目のパラメーターは'show'ですが、追加または削除する関数ではないでしょうか?
ヤンファブリ

回答:


7

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');
?>

7

私はテストにあなたのサイトを持っていないが、私はあなただけ削除する必要があると考えているので、私は確かに言うことができない'show'からremove_action()add_action()呼び出し。の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);
}

お役に立てれば?


ええ、最初のコードは私が始めたもので、通常のWordPress投稿で機能しますが、「show」の条件を追加すると、何も機能しません。条件がなくても、カスタム投稿タイプでは機能しません。
curtismchale

私はあなたの質問を何度か読みましたが、うまくいかない提案されたコードを無視した場合、あなたが何を達成しようとしているのか正確にはまだわかりません。何を達成しようとしているかを明確にできますか?post_dateにある日時に投稿を公開しますか?または、すでに解決しましたか?
-MikeSchinkel

すでに解決済みです(以下のコードを提供しました)。将来予定されている場合でも、カスタム投稿タイプの投稿を公開したかっただけです。
-curtismchale

4

このアクションはに呼び出されると思います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またはあなたのタイプのスラッグが何になります。


1

あなたがしたいのが「ショータイム」に余分な日付を追加するだけであれば、それを正確に行うメタボックスを追加する方が簡単かもしれません-パブリッシュする公開日付を使用すると、WordPressがそれを設定するため、潜在的に問題になる可能性があります将来の公開日で更新されるたびに「将来」のステータス(私は思う)ので、投稿を更新するたびにフックして、再び設定を戻す必要があります。また、その方法では、意図する「公開日」を予約できます。

おそらく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週間後にショータイム付きのすべての「イベント」を取得します。注:上記はテストされていませんが、動作するはずです :)


私はこの100%に同意します-イベント日付のハックとして公開日付を使用するよりも、メタボックスを使用する方がはるかに優れています。
トラビスノースカット

ええ、meta_boxは機能しますが、素敵なjQueryの日付と時刻のピッカーを追加するのは難しいと感じました。ストックWPの1つは、私が思いつくものよりもずっといいものでした。
-curtismchale

WP Easy Post Typesプラグインはカスタムの日付フィールドを提供し、簡単な日付ピッカーを提供します。私は自分でイベントリスト機能にそれを使用しました。
リックカラン

0

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;
}

これがどのように機能するかの説明を追加してください。
ニコライ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.