web-dev-qa-db-fra.com

Marquer le poste postdaté futur tel que publié

Cas d'utilisation:

J'ai un type de message qui se rapporte à une émission musicale. La "date du spectacle" est saisie via la date de publication après publication, qui est définie pour une date ultérieure. J'ai trouvé une fonction qui prend les articles de blog postdatés et laisse la date, mais marque le message comme étant publié lors de l'enregistrement mais ne sait pas comment le personnaliser pour un type d'article personnalisé.

La fonction est ci-dessous.

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

Super, combinant les réponses de Mike et Jan, j’ai proposé ce qui ne fonctionne que pour le type de message en question. Nous n'avons pas besoin de la condition de show, car le hook 'future_show' ne saisit que le type de post de l'émission et le met à jour.

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

Je ne peux pas en être sûr, car je n'ai pas votre site à tester, mais je pense que vous devez simplement supprimer 'show' des appels remove_action() et add_action(). La fonction wp_publish_post() est agnostique en ce qui concerne les types de publication, du moins c'est ce qui ressort de la lecture du code. Alors essayez ceci:

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

Bien sûr, si vous voulez vous limiter à ne faire que des shows, vous voudrez peut-être faire quelque chose comme ceci (bien que la logique soit plus compliquée si vous avez besoin de travailler avec d'autres types de posts aussi):

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

J'espère que cela t'aides?

6
MikeSchinkel

Je pense que cette action est appelée par wp_transition_post_status . Le code est:

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

Donc, pour les futures publications normales, le dernier hook sera future_post, mais pour votre type, ce sera future_show ou quel que soit votre slug de type.

3
Jan Fabry

Si tout ce que vous voulez faire est d’ajouter une date supplémentaire pour les "heures de diffusion", il peut être plus facile d’ajouter une méta-boîte qui fait exactement cela - utiliser la date de publication pour la falsifier peut être potentiellement problématique, car WordPress le définira comme suit: statut "futur" à chaque fois qu'il est mis à jour avec une date de publication future (je pense), vous devrez donc vous raccrocher chaque fois qu'un message est mis à jour pour le rétablir. En outre, de cette façon, vous pourriez réserver "Date de publication" à ce à quoi il est destiné.

J'utiliserais probablement juste un meta_key et une méta-boîte personnalisée. Bien que cela dépend de la complexité de vos requêtes qui montrent les messages.

Si vous définissez meta_value comme horodatage, vous pouvez toujours commander par date d'affichage ou sélectionner avant/après une certaine date:

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

Obtenez tous les "événements" avec une heure de diffusion au plus tard une semaine à compter de la date du jour. Remarque: Ce qui précède n’a pas été testé, mais devrait travail :)

1
Joe Hoyle

WP Dev Nacin utilise une simple substitution de fonction:

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