Marquer le futur post daté comme publié


13

Cas d'utilisation:

J'ai un type de message lié à un spectacle de musique. L '«heure du spectacle» est saisie à travers la date de publication qui est fixée à une date ultérieure. J'ai trouvé une fonction qui prend les futurs articles de blog datés et laisse la date, mais marque le message comme publié lors de la sauvegarde, mais je n'ai pas réussi à le personnaliser pour un type de message 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');
?>

1
Est-il possible que vous ayez une erreur dans votre appel remove_actionet add_action? Votre deuxième paramètre est 'show', mais ne devrait-il pas être la fonction que vous ajoutez ou supprimez?
Jan Fabry

Réponses:


7

Génial combinant à la fois les réponses de Mike et Jan. J'ai trouvé cela qui ne fonctionne que sur le type de message en question. Nous n'avons pas besoin du conditionnel de show car le hook 'future_show' ne saisit que le type de post de show 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');
?>

7

Je ne peux pas le dire avec certitude, car je n'ai pas votre site pour tester, mais je crois que vous avez juste besoin de supprimer 'show'de remove_action()et d' add_action()appels. La wp_publish_post()fonction est agnostique en ce qui concerne les types de publication, du moins c'est ce qu'elle apparaît à la lecture du code. Essayez donc 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 émissions, vous voudrez peut-être faire quelque chose comme ça (bien que la logique soit plus compliquée si vous en avez besoin pour travailler avec d'autres types de messages 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?


Oui, le premier morceau de code est ce que j'ai commencé et il fonctionne sur les publications WordPress normales, mais si vous ajoutez la condition de `` montrer '', cela ne fonctionne sur rien. Même sans condition, cela ne fonctionne pas sur un type de publication personnalisé.
curtismchale

J'ai lu votre question plusieurs fois, mais je ne sais toujours pas exactement ce que vous essayez d'accomplir si nous ignorons le code suggéré qui ne fonctionne pas. Pouvez-vous préciser ce que vous essayez d'accomplir exactement? Voulez-vous publier le post à la date / heure qui se trouve dans la post_date, ou autre chose? Ou l'avez-vous déjà résolu?
MikeSchinkel

C'est déjà résolu (j'ai fourni le code ci-dessous). Je voulais juste publier le message de type de message personnalisé même s'il était prévu pour l'avenir.
Curtismchale

4

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 futurs messages normaux, le dernier crochet sera future_post, mais pour votre type, ce sera future_showou quel que soit votre type de slug.


1

Si tout ce que vous voulez faire est d'ajouter une date supplémentaire pour les `` heures d'affichage '', il peut être plus facile d'ajouter une méta-boîte qui fait exactement cela - l'utilisation de la date de publication pour usurper cela pourrait être potentiellement problématique, car WordPress la définira sur statut "futur" chaque fois qu'il est mis à jour avec une date de publication future (je pense), donc vous devrez vous accrocher à chaque fois qu'un article est mis à jour pour le remettre en place. De plus, de cette façon, vous pouvez réserver la «date de publication» à ce à quoi elle est destinée.

J'utiliserais probablement juste un meta_key, et une meta box personnalisée. Bien que cela dépend de la complexité de vos requêtes qui affichent les publications.

Si vous définissez la meta_value comme horodatage, vous pouvez toujours commander par la date de l'heure 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' );

Obtiendrait tous les «événements» avec un showtime au plus tard une semaine après la date actuelle. Remarque: ce qui précède n'est pas testé, mais devrait fonctionner :)


Je suis d'accord avec cela à 100% - il vaut mieux utiliser une méta-boîte que d'utiliser la date de publication comme hack pour la date de l'événement.
Travis Northcutt du

Oui, une meta_box fonctionnerait, mais j'ai trouvé difficile d'ajouter un joli sélecteur de date et d'heure jQuery. Le WP d'origine était bien plus agréable que tout ce que je pouvais imaginer.
curtismchale

Le plugin WP Easy Post Types donne un champ de date personnalisé et fournit un simple sélecteur de date, je l'ai utilisé moi-même pour une fonction de liste d'événements.
Rick Curran

0

WP Dev Nacin utilise un simple remplacement 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;
}

Veuillez ajouter quelques explications sur la façon dont cela fonctionne.
Nicolai
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.