Đánh dấu bài viết trong tương lai như đã xuất bản


13

Trường hợp sử dụng:

Tôi có một loại bài đăng liên quan đến một chương trình âm nhạc. 'Thời gian hiển thị' được lấy qua ngày xuất bản bài được đặt thành một thời gian trong tương lai. Tôi đã tìm thấy một chức năng lấy các bài đăng trên blog trong tương lai và để lại ngày nhưng đánh dấu bài đăng là được xuất bản khi lưu nhưng không thể tìm ra cách tùy chỉnh nó cho loại bài đăng tùy chỉnh.

Các chức năng dưới đây.

<?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
Có thể bạn có một lỗi trong của bạn remove_actionadd_actioncuộc gọi? Tham số thứ hai của bạn là 'show', nhưng không nên là chức năng bạn đang thêm hoặc xóa?
Jan Fabry

Câu trả lời:


7

Tuyệt vời kết hợp cả hai câu trả lời từ Mike và Jan Tôi đã đưa ra cái này chỉ hoạt động trên loại bài đăng trong câu hỏi. Chúng tôi không cần điều kiện hiển thị vì hook 'tương lai_show' chỉ lấy loại bài đăng của chương trình và cập nhật.

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

Tôi không thể nói chắc chắn kể từ khi tôi không có trang web của bạn để thử nghiệm với nhưng tôi tin rằng bạn chỉ cần loại bỏ 'show'từ remove_action()add_action()các cuộc gọi. Các wp_publish_post()chức năng là bất khả tri đối với bài loại với, ít nhất đó là những gì nó xuất hiện từ việc đọc mã. Vì vậy, hãy thử điều này:

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

Tất nhiên, nếu bạn muốn giới hạn chỉ thực hiện các chương trình, bạn có thể muốn làm một cái gì đó như thế này (mặc dù logic sẽ phức tạp hơn nếu bạn cũng cần nó để làm việc với các loại bài đăng khác):

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

Hi vọng điêu nay co ich?


Vâng, đoạn mã đầu tiên là những gì tôi đã bắt đầu và nó hoạt động trên các bài đăng WordPress bình thường nhưng nếu bạn thêm điều kiện 'hiển thị' thì nó không hoạt động trên bất cứ thứ gì. Ngay cả khi không có điều kiện, nó không hoạt động trên một loại bài tùy chỉnh.
curtismchale

Tôi đã đọc câu hỏi của bạn nhiều lần nhưng tôi vẫn chưa rõ chính xác những gì bạn đang cố gắng thực hiện nếu chúng tôi bỏ qua mã được đề xuất không hoạt động. Bạn có thể làm rõ chính xác những gì bạn đang cố gắng để thực hiện? Bạn có muốn xuất bản bài đăng vào ngày / giờ trong post_date, hay cái gì khác không? Hay bạn đã giải quyết nó?
MikeSchinkel

Nó đã được giải quyết (tôi đã cung cấp mã bên dưới). Tôi chỉ muốn xuất bản bài đăng loại bài tùy chỉnh ngay cả khi được lên kế hoạch cho tương lai.
curtismchale

4

Tôi nghĩ rằng hành động này được gọi bởi wp_transition_post_status. Mã này là:

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

Vì vậy, đối với các bài viết trong tương lai bình thường, cái móc cuối cùng sẽ là future_post, nhưng đối với kiểu của bạn thì nó sẽ là future_showhoặc bất cứ loại sên nào của bạn.


1

Nếu tất cả những gì bạn muốn làm là thêm một ngày cho 'thời gian hiển thị', thì việc thêm một hộp meta chính xác là như vậy - sử dụng ngày Xuất bản để giả mạo có thể có vấn đề, vì WordPress sẽ đặt nó thành Trạng thái "tương lai" bất cứ khi nào nó được cập nhật với ngày xuất bản trong tương lai (tôi nghĩ), vì vậy bạn sẽ phải nối mỗi khi bài đăng được cập nhật để đặt lại. Ngoài ra, theo cách đó bạn có thể đặt trước "Ngày xuất bản" cho mục đích của nó.

Tôi có lẽ sẽ chỉ sử dụng một meta_key, và một hộp meta tùy chỉnh. Mặc dù nó phụ thuộc vào mức độ phức tạp của các truy vấn của bạn mà hiển thị các bài đăng.

Nếu bạn đặt meta_value làm dấu thời gian, bạn có thể đặt hàng trước ngày giờ hiển thị hoặc chọn trước / sau một ngày nhất định:

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

Sẽ nhận được tất cả "sự kiện" với thời gian chiếu không muộn hơn một tuần kể từ ngày hiện tại. Lưu ý: Trên chưa được kiểm tra, nhưng nên hoạt động :)


Tôi đồng ý với điều này 100% - sử dụng hộp meta tốt hơn nhiều so với sử dụng ngày xuất bản dưới dạng hack cho ngày sự kiện.
Travis Northcutt

Vâng, một meta_box sẽ hoạt động nhưng tôi cảm thấy khó khăn khi thêm một công cụ chọn ngày và giờ jQuery đẹp. Cổ phiếu WP one đẹp hơn bất cứ thứ gì tôi có thể nghĩ ra.
curtismchale

Plugin WP Easy Post Forms cung cấp trường ngày tùy chỉnh và cung cấp trình chọn ngày đơn giản, tôi đã sử dụng nó cho chức năng liệt kê Sự kiện.
Rick Curran

0

WP Dev Nacin sử dụng chức năng ghi đè chức năng đơn giản:

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

Vui lòng thêm một số giải thích làm thế nào điều này hoạt động.
Nicolai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.