synetech
  • 0
Новичок

Пометка будущей публикации как опубликованной

  • 0

Вариант использования:

У меня есть тип сообщения, который относится к музыкальному шоу. «Время показа» определяется по дате публикации поста, которая устанавливается на какое-то время в будущем. Я нашел функцию, которая берет будущие посты в блоге и оставляет дату, но помечает пост как опубликованный при сохранении, но не смог понять, как настроить его для пользовательского типа поста.

Функция ниже.

<?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');
?>
Share
  1. Возможно ли, что у вас есть ошибка в вашем remove_action и add_action вызова? Ваш второй параметр — 'show', но разве это не должна быть функция, которую вы добавляете или удаляете?

    • 0
  2. Удивительно, объединив ответы Майка и Яна. Я придумал это, которое работает только для рассматриваемого типа сообщения. Нам не нужно условное выражение show, потому что хук ‘future_show’ захватывает только тип сообщения 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');
    ?>
    
    • 0
  3. Я не могу сказать наверняка, так как у меня нет вашего сайта для тестирования, но я считаю, что вам просто нужно удалить '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);
    }
    

    Надеюсь это поможет?

    • 0
  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 или какой-либо другой слаг вашего типа.

    • 0
  5. Если все, что вы хотите сделать, это добавить дополнительную дату для «времени показа», может быть проще добавить мета-поле, которое делает именно это — использование даты публикации для подделки может быть потенциально проблематичным, поскольку 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' );

    Получал бы все «события» с временем показа не позднее, чем через неделю с текущей даты. Примечание. Вышеприведенное не проверено, но должно работать 🙂

    • 0
  6. 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

Оставить ответ

You must login to add an answer.