web-dev-qa-db-fra.com

le hook publish_post ne fonctionne pas pour les publications programmées

Le fait que wp-to-Twitter publie un lien vers un message défini comme "en attente" que j'ai envoyé par courrier électronique à mon site wordpress.org me posait un problème. Le courrier électronique contenait un pied de page contenant mon numéro de téléphone portable.

J'ai décidé de créer mon propre plugin.

add_action('publish_post', 'tcr_Tweet');

/* the function */
function tcr_Tweet($postID)
{

    if( ( $_POST['post_status'] == 'publish' ) && ( $_POST['original_post_status'] != 'publish' ) ) {
            /* get the post that's being published */
            $post = get_post($postID); 
            $post_title = $post->post_title;

            /* get the author of the post */
            $author_id=$post->post_author;
            /* author needs a twitterid in their meta data*/
            $author = get_the_author_meta('twitterid',$author_id );

            /* get the permalink and shorten it */
            $url = get_permalink($postID);
            $short_url = getBitlyUrl($url);

            //check to make sure the Tweet is within the 140 char limit
            //if not, shorten and place Ellipsis and leave room for link. 
                    if (strlen($post_title) + strlen($short_url) > 100) {
                       $total_len = strlen($post_title) + strlen($short_url);
                       $over_flow_count = $total_len - 100;
                       $post_title = substr($post_title,0,strlen($post_title) - $over_flow_count - 3);
                       $post_title .= '...';                
                    }

            //add in the shortened bit.ly link
            $message =  "New: ".$post_title." - ".$short_url." by @".$author." #hashtag";

             if ( $post->post_status != 'publish' ) return;
            //call the Tweet function to Tweet out the message
            goTweet($message);
    }

}

mon plugin est un simple plugin, il appelle à ma fonction bit.ly puis à une autre fonction que tweets, ces fonctions sont utilisées ailleurs et fonctionnent parfaitement bien.

Mon problème est que si je programme un message, rien ne sera tweeté, si je clique sur Publier sur un nouveau message, je reçois un écran blanc, mais Tweet est envoyé.

Comment cibler correctement les publications programmées? J'ai consulté mes données $_POST et tout semble aller pour le mieux. Le code semble assez simple, donc il me manque quelque chose .. merci

Modifier:

J'ai un peu de confusion sur le fonctionnement de WordPress avec les publications planifiées post_status='future' lorsque le moment vient et que la publication doit être diffusée en direct, elle devient sûrement post_status='publish' car ce n'est plus une publication "future". donc ma fonction devrait être déclenchée quand

 add_action('publish_post', 'tcr_Tweet'); 
 add_action('publish_future_post', 'tcr_Tweet'); 
 add_action('future_to_publish', 'tcr_Tweet');

ces actions sont déclenchées. Dois-je vérifier que la date est passée à la place, si un post_status reste comme "futur"?

1
Benny

J'ai retravaillé (ajouté une autre version de) ma fonction pour supprimer la déclaration if afin de vérifier le statut de la publication, car la publication est programmée pour la publier, je n'ai donc pas besoin de la vérifier à nouveau.

/* the function */
function tcr_Tweet2($postID)
{

            /* get the post that's being published */
            $post = get_post($postID); 
            $post_title = $post->post_title;

            /* get the author of the post */
            $author_id=$post->post_author;
            /* author needs a twitterid in their meta data*/
            $author = get_the_author_meta('twitterid',$author_id );

            /* get the permalink and shorten it */
            $url = get_permalink($postID);
            $short_url = getBitlyUrl($url);

            //check to make sure the Tweet is within the 140 char limit
            //if not, shorten and place Ellipsis and leave room for link. 
                    if (strlen($post_title) + strlen($short_url) > 100) {
                       $total_len = strlen($post_title) + strlen($short_url);
                       $over_flow_count = $total_len - 100;
                       $post_title = substr($post_title,0,strlen($post_title) - $over_flow_count - 3);
                       $post_title .= '...';                
                    }

            //add in the shortened bit.ly link
            $message =  "New: ".$post_title." - ".$short_url." by @".$author." #hashtag";

             if ( $post->post_status != 'publish' ) return;
            //call the Tweet function to Tweet out the message
            goTweet($message);
}

Je peux alors utiliser le hook suivant juste pour cette version et ça marche.

 add_action('future_to_publish', 'tcr_Tweet2');
3
Benny

Il existe un crochet d’action supplémentaire pour les messages programmés: publish_future_post - il n’est pas très bien documenté. Il y a des occurrences du crochet dans:

Le hook appelle check_and_publish_future_post () . Lisez les informations liées si vous souhaitez vous informer davantage. En outre, le crochet fonctionne comme on pourrait s'y attendre.

2
Nicolai

J'ai utilisé add_action ('transition_post_status', 'my_action'); et cela fonctionne très bien pour les posts publiés directement ou à l'avenir. La fonction my_action étant:

function my_action ($new_status, $old_status, $post) {

    if (($old_status != 'publish') && ($new_status == 'publish')) {
        // doing things.
    }
}
2