web-dev-qa-db-ja.com

post_status = publishのときに投稿編集ページにボタンを追加する

質問

  • 「投稿の編集」管理ページの「公開」メタボックスにカスタムボタンを追加するために使用できるフックは何ですか。

使用事例

私はash_newsletterという手巻きのカスタム投稿タイプを持っています。この投稿タイプのpost.php?post={$post->ID}&action=edit管理ページにボタンを追加したいです。ボタンは投稿が公開された後にのみ表示されます。ボタンは一度だけクリック可能になります。ボタンは "Publish"メタボックスにあります。

私の考えでは、ボタンがクリックされると、スクリプトが現在の投稿ステータスをチェックし、post_meta、ash_already_ran == falseをチェックします。両方の条件が満たされると、別のサービスに連絡する関数が呼び出されます。関数がtrueを返すと、 'ash_already_ran'はtrueに更新されます。

4
dnagirl

これであなたは始めるでしょう。

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

Publish Meta Boxにカスタムボタンを追加します。

enter image description here

これまでのところまだあなたがする必要があります。

  • カスタム投稿タイプにのみカスタムボタンを登録する
  • postにpublishのpost_statusがある場合にのみボタンを表示するための条件付きチェックを書く
  • あなたのカスタムサービスを呼び出すためのカスタム関数を書く

私は今行く必要がありますが、上記の点に取り組み、あなたの結果を投稿しようとしないでください。明日私はあなたが現在どこにいるのか、そして他の誰かがさらに手助けできるかどうかを見るために戻ってきます。

9
userabuser

ヘッドスタートをありがとう userabuser 。拡張されたコードは次のようになります。

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

今日の5年以上前の問題を解決する必要がないようにサービス層をするいくつかの方法があります。しかし、これは将来的には誰にとっても良いコピー/ペーストの開始となるはずであり、そのまま使用できます。

あなたのJSを別々にロードされたファイルに含めるほうが明らかに良いですが、もう少し読みやすいJSをハックしたいのなら、 ob_startob_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

post_submitbox_misc_actionsフックを使用するのが適切な方法ですが、前の回答で示唆したようにDOM IDを2回使用するべきではありません。したがって、HTML出力は次のようになります。

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

参照してください: https://developer.wordpress.org/reference/functions/post_submit_meta_box/

1
Dominik Späte