web-dev-qa-db-fra.com

ajout d'un bouton pour publier une page d'édition lorsque post_status = publier

Question

  • quel crochet peut être utilisé pour ajouter un bouton personnalisé à la métabox "Publier" sur la page d'administration "Editer le message"?

Cas d'utilisation

J'ai un type de message personnalisé roulé à la main appelé ash_newsletter. Je souhaite ajouter un bouton à la page d'administration post.php?post={$post->ID}&action=edit pour ce type de message. Le bouton n'apparaîtra qu'une fois l'article publié. Le bouton ne sera cliquable qu'une fois. Le bouton sera situé dans la metabox "Publier".

Mon idée est que, lorsque l'utilisateur clique sur le bouton, un script vérifie l'état de la publication en cours et vérifie qu'un post_meta, ash_already_ran == false. Si les deux conditions sont remplies, une fonction sera appelée pour contacter un autre service. Si la fonction retourne true, 'ash_already_ran' sera mis à jour sur true.

4
dnagirl

Cela vous aidera à démarrer.

add_action( 'post_submitbox_misc_actions', 'custom_button' );

function custom_button(){
        $html  = '<div id="major-publishing-actions" style="overflow:hidden">';
        $html .= '<div id="publishing-action">';
        $html .= '<input type="submit" accesskey="p" tabindex="5" value="Customize Me!" class="button-primary" id="custom" name="publish">';
        $html .= '</div>';
        $html .= '</div>';
        echo $html;
}

Ajoute un bouton personnalisé à Publish Meta Box - exemple;

enter image description here

Jusqu'à présent, vous devez toujours le faire.

  • enregistrer le bouton personnalisé sur votre type de message personnalisé uniquement
  • écrire une vérification conditionnelle pour ne montrer que le bouton lorsque post a le statut post_status de publication
  • écrire une fonction personnalisée pour appeler votre service personnalisé

Je dois y aller maintenant, mais essayez d'aborder les points ci-dessus et affichez vos résultats. Je reviendrai demain pour voir où vous en êtes et si quelqu'un d'autre peut aider davantage.

9
userabuser

Merci userabuser pour le bon départ. Je crois que le code développé ressemblerait davantage à:

add_action( 'post_submitbox_misc_actions', 'custom_button', 10, 1 );

function custom_button( $post ) {

    // Show only for published pages.
    if ( ! $post
         || 'publish' !== $post->post_status
         || 'page' !== $post->post_type ) {
        return;
    }

    $html = '<div id="major-publishing-actions" style="overflow:hidden">';
    $html .= '<div id="publishing-action">';
    $html .= '<input type="submit" accesskey="p" tabindex="5" value="Custom Button" class="button-primary" id="submitbox-custom-button" name="publish">';

    // Post meta example.
    $user = get_user_by( 'ID', get_post_meta( $post->ID, '_edit_last', true ) );
    if ( $user ) {
        $html .= '<div>' . ucfirst( $post->post_type ) . ' ' . $post->ID . ' last edited by ' . $user->display_name . '</div>';
    }

    $html .= '</div>';
    $html .= '</div>';

    // Customize button click event.
    $html .= "<script>window.addEventListener('load', function(){ jQuery('input#submitbox-custom-button').click(function(event){  event.preventDefault(); alert('You\'re editing " . $post->post_type . " " . $post->ID . "'); return true; }); }); </script>";

    echo $html;
}

Il y a plusieurs façons de faire la couche de service, il n'est donc pas nécessaire de résoudre ce problème de plus de 5 ans aujourd'hui. Mais cela devrait être un bon début copier/coller pour tout le monde à l'avenir et fonctionnera hors de la boîte.

Il est évidemment préférable d'inclure votre JS dans un fichier chargé séparément, mais si vous avez envie de pirater un JS un peu plus lisible, vous pouvez utiliser ob_start et ob_get_clean .

ob_start(); ?>
<script>window.addEventListener('load', function() {
    jQuery('input#submitbox-custom-button').click(function(event) {
      event.preventDefault();
      alert('You\'re editing <?php echo $post->post_type . " " . $post->ID; ?>');
      return true;
    });
  });
</script>
<?php $html .= ob_get_clean();
2
jgraup

Utiliser post_submitbox_misc_actions hook est une méthode appropriée, mais vous ne devez pas utiliser les ID DOM deux fois comme suggéré dans les réponses précédentes. Ainsi, votre sortie HTML devrait ressembler à ceci:

add_action( 'post_submitbox_misc_actions', function( $post ){
    // check something using the $post object
    if ( get_post_status( $post->ID ) === 'publish' ){
        echo '<div class="misc-pub-section">Some button...</div>';
    }
});

Voir: https://developer.wordpress.org/reference/functions/post_submit_meta_box/

1
Dominik Späte