ทำเครื่องหมายโพสต์ลงวันที่ในอนาคตตามที่เผยแพร่


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? พารามิเตอร์ที่สองของคุณคือ'show'แต่ไม่ควรเป็นฟังก์ชั่นที่คุณกำลังเพิ่มหรือลบ?
Jan Fabry

คำตอบ:


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 ปกติ แต่ถ้าคุณเพิ่มเงื่อนไขของ 'แสดง' มันไม่ทำงานอะไรเลย แม้ว่าจะไม่มีเงื่อนไขก็ตาม แต่ก็ไม่สามารถใช้กับประเภทโพสต์ที่กำหนดเองได้
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' );

จะได้รับ "กิจกรรม" ทั้งหมดโดยมีเวลาฉายไม่เกินหนึ่งสัปดาห์จากวันที่ปัจจุบัน หมายเหตุ: ข้างต้นไม่ได้ทดสอบ แต่ควรใช้งานได้ :)


ฉันเห็นด้วยกับสิ่งนี้ 100% - ดีกว่าการใช้เมตาบ็อกซ์มากกว่าการใช้วันที่เผยแพร่เป็นแฮ็คสำหรับวันที่จัดกิจกรรม
Travis Northcutt

ใช่ meta_box จะทำงานได้ แต่ฉันพบว่ามันยากที่จะเพิ่มตัวเลือกวันที่และเวลา jQuery ที่ดี หนึ่งในหุ้น WP นั้นดีกว่าทุกอย่างที่ฉันคิด
Curtismchale

ปลั๊กอิน WP Easy Post Types ให้ฟิลด์วันที่กำหนดเองและมีตัวใช้เลือกวันที่อย่างง่ายฉันใช้เพื่อฟังก์ชั่นการแสดงรายการกิจกรรมด้วยตัวเอง
Curran ริก

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

โปรดเพิ่มคำอธิบายวิธีการทำงาน
Nicolai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.