it-swarm.asia

بمناسبة مستقبل مؤرخة النشر كما نشرت

حالة الاستخدام:

لديّ نوع منشور يتعلق بعرض موسيقي. يتم الحصول على "وقت العرض" خلال تاريخ نشر النشر الذي يتم تعيينه في وقت ما في المستقبل. لقد عثرت على وظيفة تأخذ تدوينات مؤرخة مؤرخة في المستقبل وتترك التاريخ ، ولكن يتم وضع علامة على المنشور المنشور في الحفظ ولكن لم نتمكن من تحديد كيفية تخصيصه لنوع منشور مخصص.

وظيفة أدناه.

<?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

رائع بين الجمع بين كل من إجابات مايك وجان لقد توصلت إلى هذا الأمر الذي يعمل فقط على نوع المنشور المعني. لسنا بحاجة إلى شرط العرض لأن ربط "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

لا أستطيع أن أجزم بالتأكيد لأنني لا أمتلك موقعك للاختبار ، لكنني أعتقد أنك بحاجة فقط إلى إزالة 'show' من remove_action() و add_action() calls. وظيفة 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

إذا كان كل ما تريد القيام به هو إضافة تاريخ إضافي لـ "أوقات العرض" ، فقد يكون من الأسهل إضافة صندوق تعريف يعمل بالضبط - باستخدام تاريخ النشر للتزوير ، فقد يكون ذلك مشكلة ، لأن 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
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