Adăugare buton în pagina de editare articol când post_status=publish
Întrebare
- ce hook poate fi folosit pentru a adăuga un buton personalizat în metabox-ul 'Publish' pe pagina de administrare 'Edit Post'?
Caz de utilizare
Am un tip de postare personalizat numit ash_newsletter
. Doresc să adaug un buton pe pagina de administrare post.php?post={$post->ID}&action=edit
pentru acest tip de postare. Butonul va apărea doar după ce postarea a fost publicată. Butonul va putea fi accesat doar o singură dată. Butonul va fi localizat în metabox-ul "Publish".
Ideea mea este că atunci când butonul este apăsat, un script va verifica starea curentă a postării și va verifica dacă o metadatelă, ash_already_ran==false. Dacă ambele condiții sunt îndeplinite, va fi apelată o funcție care contactează un alt serviciu. Dacă funcția returnează true, 'ash_already_ran' va fi actualizată la true.

Acesta este punctul de pornire;
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="Personalizează-mă!" class="button-primary" id="custom" name="publish">';
$html .= '</div>';
$html .= '</div>';
echo $html;
}
Adaugă un buton personalizat în căsuța Meta de Publicare - exemplu;
Până acum mai trebuie să:
- înregistrezi butonul personalizat doar pe tipul tău personalizat de postare
- scrii o verificare condițională pentru a afișa butonul doar când postarea are statusul de publicat
- scrii o funcție personalizată pentru a apela serviciul tău particular
Trebuie să plec acum, dar încearcă să abordezi punctele de mai sus și postează-ți rezultatele. Mă voi întoarce mâine să văd unde ați ajuns și dacă mai poate ajuta cineva.

super! Deci am butonul meu care apare doar pe postarea mea personalizată și doar când postarea este publicată și nu are o valoare pentru 'already_done'. Am scris și testat funcția mea service_call
. Singurul lucru de care încă nu sunt sigur este la ce hook ar trebui să atașez service_call()
.

știu că acest post este vechi dar ai putea să arăți codul complet, asta este exact ceea ce căutam să fac.

Mulțumesc userabuser
pentru început. Cred că codul extins ar arăta mai degrabă astfel:
add_action( 'post_submitbox_misc_actions', 'custom_button', 10, 1 );
function custom_button( $post ) {
// Afișează doar pentru paginile publicate.
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="Buton Personalizat" class="button-primary" id="submitbox-custom-button" name="publish">';
// Exemplu de meta pentru postare.
$user = get_user_by( 'ID', get_post_meta( $post->ID, '_edit_last', true ) );
if ( $user ) {
$html .= '<div>' . ucfirst( $post->post_type ) . ' ' . $post->ID . ' editat ultima dată de ' . $user->display_name . '</div>';
}
$html .= '</div>';
$html .= '</div>';
// Personalizează evenimentul de click pe buton.
$html .= "<script>window.addEventListener('load', function(){ jQuery('input#submitbox-custom-button').click(function(event){ event.preventDefault(); alert('Editezi " . $post->post_type . " " . $post->ID . "'); return true; }); }); </script>";
echo $html;
}
Există mai multe modalități de a implementa stratul de serviciu, așa că nu este nevoie să rezolvi acea problemă veche de peste 5 ani astăzi. Dar acesta ar trebui să fie un bun punct de plecare pentru copiere/inserare pentru oricine în viitor și va funcționa imediat.
Este evident mai bine să incluzi JavaScript-ul într-un fișier încărcat separat, dar dacă vrei să adaugi un JavaScript mai lizibil, poți folosi ob_start
și ob_get_clean
.
ob_start(); ?>
<script>window.addEventListener('load', function() {
jQuery('input#submitbox-custom-button').click(function(event) {
event.preventDefault();
alert('Editezi <?php echo $post->post_type . " " . $post->ID; ?>');
return true;
});
});
</script>
<?php $html .= ob_get_clean();

Utilizarea cârligului post_submitbox_misc_actions
este o metodă adecvată, dar nu ar trebui să utilizați ID-uri DOM de două ori, așa cum a fost sugerat în răspunsurile anterioare. Astfel, codul HTML generat ar trebui să arate astfel:
add_action( 'post_submitbox_misc_actions', function( $post ){
// verifică ceva folosind obiectul $post
if ( get_post_status( $post->ID ) === 'publish' ){
echo '<div class="misc-pub-section">Un buton...</div>';
}
});
Vezi: https://developer.wordpress.org/reference/functions/post_submit_meta_box/
