Позначення майбутнього датованого поста як опублікованого


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'але чи не це повинна бути функція, яку ви додаєте чи видаляєте?
Ян Фабрі

Відповіді:


7

Чудово поєднуючи обидві відповіді Майка та Яна, я придумав це, що працює лише над питанням про посаду. Нам не потрібно умовне шоу, тому що гачок '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', він нічого не працює. Навіть без умовного режиму це не працює на користувацькому типі пошти.
курсизм

Я кілька разів читав ваше запитання, але мені все ще незрозуміло, що саме ви намагаєтеся виконати, якщо ми ігноруємо запропонований код, який не працює. Чи можете ви уточнити, що саме ви намагаєтеся досягти? Ви хочете опублікувати публікацію в дату / час у post_date або щось інше? Або ти вже це вирішив?
MikeSchinkel

Це вже вирішено (я надав код нижче). Я просто хотів опублікувати спеціальну публікацію типу публікації, навіть якщо це заплановано на майбутнє.
курсизм

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і власне мета-поле. Хоча це залежить від того, наскільки складні ваші запити, які показують публікації.

Якщо ви встановили мета_значення як часову позначку, ви можете замовити за датою часу показу або вибрати перед / після певної дати:

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

Усі "події" будуть показані не пізніше тижня від поточної дати. Примітка: вищезазначене не перевірено, але має працювати :)


Я погоджуюся з цим 100% - набагато краще використовувати метабокс, ніж використовувати дату публікації як хак для дати події.
Травіс Нортчетт

Так, мета_box працював би, але мені було складно додати приємний інструмент вибору дати та часу jQuery. Фондовий WP один був способом приємнішим за все, що я міг придумати.
курсизм

Плагін 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;
}

Будь ласка, додайте пояснення, як це працює.
Миколай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.