Come mostrare un meta box personalizzato nella schermata "Modifica rapida"?

26 ott 2010, 17:36:00
Visualizzazioni: 17.9K
Voti: 23

Ho utilizzato add_meta_box() per aggiungere un meta box personalizzato alla finestra di modifica di WordPress sia per le pagine che per gli articoli.

Come posso fare in modo che questo meta box appaia anche nella schermata "Modifica rapida"?

Idealmente, vorrei che apparisse proprio a destra del selettore delle categorie.

1
Commenti

Ho anche risposto a questo con un modo più semplice per farlo in questo post qui http://wordpress.stackexchange.com/questions/7291/quick-edit-screen-customization#8098

jaredwilli jaredwilli
30 gen 2011 13:12:37
Tutte le risposte alla domanda 2
3
22

Sembra non esserci un modo semplice per farlo, devi aggiungere tutto il codice manualmente. inline_edit_row(), la funzione che disegna le schermate di Modifica Rapida e Modifica Massiva, sembra avere solo un'azione a cui puoi agganciarti: quick_edit_custom_box o bulk_edit_custom_box. Viene chiamata per tutte le colonne non-core che wp_manage_posts_columns() restituisce. Ci sono alcuni filtri che puoi usare per aggiungere una colonna, ad esempio manage_posts_columns. Sfortunatamente, questa funzione definisce gli header delle colonne della tabella degli articoli, quindi dovresti rimuoverla nuovamente prima che print_column_headers() li stampi. Questo può essere fatto nella funzione get_column_headers(), con il filtro manage_[screen_id]_headers. edit-post è l'ID dello schermo per la pagina di Modifica Articoli.

Mettendo tutto insieme, si ottiene un hack come il seguente per aggiungere del codice. Scoprire dove puoi gestire l'invio del form è (attualmente) lasciato come esercizio al lettore.

// Aggiunge una colonna dummy per il post type `posts`
add_filter('manage_posts_columns', 'add_dummy_column', 10, 2);
function add_dummy_column($posts_columns, $post_type)
{
    $posts_columns['dummy'] = 'Colonna dummy';
    return $posts_columns;
}
// Ma la rimuove nuovamente nella schermata di modifica (e altre schermate?)
add_filter('manage_edit-post_columns', 'remove_dummy_column');
function remove_dummy_column($posts_columns)
{
    unset($posts_columns['dummy']);
    return $posts_columns;
}

// Aggiunge il nostro testo alla box di modifica rapida
add_action('quick_edit_custom_box', 'on_quick_edit_custom_box', 10, 2);
function on_quick_edit_custom_box($column_name, $post_type)
{
    if ('dummy' == $column_name) {
        echo 'Contenuto extra nella box di modifica rapida';
    }
}

// Aggiunge il nostro testo alla box di modifica massiva
add_action('bulk_edit_custom_box', 'on_bulk_edit_custom_box', 10, 2);
function on_bulk_edit_custom_box($column_name, $post_type)
{
    if ('dummy' == $column_name) {
        echo 'Contenuto extra nella box di modifica massiva';
    }
}
26 ott 2010 21:35:31
Commenti

Grazie Jan. Ho appena fatto una domanda piuttosto simile, se avessi la gentilezza di darle un'occhiata:http://wordpress.stackexchange.com/questions/3531/how-can-i-add-columns-to-the-post-edit-listing-to-show-my-custom-post-data

Scott B Scott B
1 nov 2010 22:13:38

ho appena dato +1. Quindi non stupirti se ha ottenuto più della metà dei punti rep della domanda. Bel commento da parte di scott :)

kaiser kaiser
30 mar 2011 15:22:32

Molto utile, Jan. Domanda di follow-up: come si accede ai dati del post corrente all'interno di on_bulk_edit_custom_box per precompilare i campi? global $post sembra non funzionare.

Geert Geert
19 ott 2011 10:28:01
1

Le risposte sopra non forniscono un mezzo definitivo per salvare i dati. Il seguente codice proviene da un sistema di produzione che utilizza il tipo di post personalizzato video prima che scrivessi il plugin WordPress per la modifica in blocco Custom Bulk/Quick Edit.

File quick_edit.js

// @ref http://rachelcarden.com/2012/03/manage-wordpress-posts-using-bulk-edit-and-quick-edit/
(function($) {
    // creiamo una copia della funzione di modifica inline di WordPress
    var $wp_inline_edit = inlineEditPost.edit;
    // e poi sovrascriviamo la funzione con il nostro codice
    inlineEditPost.edit = function( id ) {
        // "chiamiamo" la funzione originale di modifica di WordPress
        // non vogliamo lasciare WordPress in sospeso
        $wp_inline_edit.apply( this, arguments );

        // ora ci occupiamo delle nostre operazioni

        // otteniamo l'ID del post
        var $post_id = 0;
        if ( typeof( id ) == 'object' )
            $post_id = parseInt( this.getId( id ) );

        if ( $post_id > 0 ) {
            // definiamo la riga di modifica
            var $edit_row = $( '#edit-' + $post_id );
            var $post_row = $( '#post-' + $post_id );

            // otteniamo i dati
            var $additional_copies = $( '.column-additional_copies', $post_row ).html();
            var $main_credits      = $( '.column-main_credits', $post_row ).html();

            // popoliamo i dati
            $( ':input[name="additional_copies"]', $edit_row ).val( $additional_copies );
            $( ':input[name="main_credits"]', $edit_row ).val( $main_credits );
        }
    };

    $( '#bulk_edit' ).live( 'click', function() {
        // definiamo la riga di modifica in blocco
        var $bulk_row = $( '#bulk-edit' );

        // otteniamo gli ID dei post selezionati che vengono modificati
        var $post_ids = new Array();
        $bulk_row.find( '#bulk-titles' ).children().each( function() {
            $post_ids.push( $( this ).attr( 'id' ).replace( /^(ttle)/i, '' ) );
        });

        // otteniamo i dati
        var $additional_copies = $bulk_row.find( 'textarea[name="additional_copies"]' ).val();
        var $main_credits      = $bulk_row.find( 'textarea[name="main_credits"]' ).val();

        // salviamo i dati
        $.ajax({
            url: ajaxurl, // questa è una variabile già definita da WordPress per noi
            type: 'POST',
            async: false,
            cache: false,
            data: {
                action: 'save_bulk_edit_video', // questo è il nome della nostra funzione AJAX di WordPress che configureremo dopo
                post_ids: $post_ids, // e questi sono i 2 parametri che passiamo alla nostra funzione
                additional_copies: $additional_copies,
                main_credits: $main_credits
            }
        });
    });
})(jQuery);

File video-quick-edit.php

<?php
/**
 *  Helper per la modifica rapida e in blocco dei record video di Media Burn
 *
 *  @author Michael Cannon <mc@aihr.us>
 *  @ref http://rachelcarden.com/2012/03/manage-wordpress-posts-using-bulk-edit-and-quick-edit/
 */

add_action( 'bulk_edit_custom_box', 'quick_edit_custom_box_video', 10, 2 );
add_action( 'quick_edit_custom_box', 'quick_edit_custom_box_video', 10, 2 );

function quick_edit_custom_box_video( $column_name, $post_type ) {
    $slug = 'video';
    if ( $slug !== $post_type )
        return;

    if ( ! in_array( $column_name, array( 'additional_copies', 'main_credits' ) ) )
        return;

    static $printNonce = true;
    if ( $printNonce ) {
        $printNonce = false;
        wp_nonce_field( plugin_basename( __FILE__ ), 'video_edit_nonce' );
    }

?>
    <fieldset class="inline-edit-col-right inline-edit-video">
      <div class="inline-edit-col inline-edit-<?php echo $column_name ?>">
        <label class="inline-edit-group">
        <?php
    switch ( $column_name ) {
    case 'additional_copies':
?>
            <span class="title">Copie Aggiuntive</span>
            <textarea cols="22" rows="1" name="additional_copies" autocomplete="off"></textarea>
            <?php
        break;
    case 'main_credits':
?>
            <span class="title">Crediti Principali</span>
            <textarea cols="22" rows="1" name="main_credits" autocomplete="off"></textarea>
            <?php
        break;
    }
?>
        </label>
      </div>
    </fieldset>
    <?php
}


add_action( 'save_post', 'save_video_meta' );

function save_video_meta( $post_id ) {
    // TODO rendere $slug statico
    $slug = 'video';
    if ( $slug !== $_POST['post_type'] )
        return;

    if ( !current_user_can( 'edit_post', $post_id ) )
        return;

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;

    if ( isset( $post->post_type ) && 'revision' == $post->post_type )
        return;

    $_POST += array( "{$slug}_edit_nonce" => '' );
    if ( !wp_verify_nonce( $_POST["{$slug}_edit_nonce"], plugin_basename( __FILE__ ) ) )
        return;

    if ( isset( $_REQUEST['additional_copies'] ) )
        update_post_meta( $post_id, 'additional_copies', wp_kses_post( $_REQUEST['additional_copies'] ) );

    if ( isset( $_REQUEST['main_credits'] ) )
        update_post_meta( $post_id, 'main_credits', wp_kses_post( $_REQUEST['main_credits'] ) );
}


add_action( 'admin_print_scripts-edit.php', 'admin_edit_video_foot' );
function admin_edit_video_foot() {
    $slug = 'video';
    // carica solo quando si modifica un video
    if ( ( isset( $_GET['page'] ) && $slug == $_GET['page'] )
        || ( isset( $_GET['post_type'] ) && $slug == $_GET['post_type'] ) ) {
        wp_enqueue_script( 'admin-quick-edit-video', get_template_directory_uri() . '/functions/user/custom/fitv/quick_edit.js', array( 'jquery', 'inline-edit-post' ), '', true );
    }
}


add_action( 'wp_ajax_save_bulk_edit_video', 'save_bulk_edit_video' );
function save_bulk_edit_video() {
    $post_ids          = ( ! empty( $_POST[ 'post_ids' ] ) ) ? $_POST[ 'post_ids' ] : array();
    $additional_copies = ( ! empty( $_POST[ 'additional_copies' ] ) ) ? wp_kses_post( $_POST[ 'additional_copies' ] ) : null;
    $main_credits      = ( ! empty( $_POST[ 'main_credits' ] ) ) ? wp_kses_post( $_POST[ 'main_credits' ] ) : null;

    if ( ! empty( $post_ids ) && is_array( $post_ids ) ) {
        foreach ( $post_ids as $post_id ) {
            update_post_meta( $post_id, 'additional_copies', $additional_copies );
            update_post_meta( $post_id, 'main_credits', $main_credits );
        }
    }

    die();
}


?>
27 set 2013 07:19:49
Commenti

Per quanto riguarda il plugin, solo una nota per gli altri: i meta dei custom post type non fanno parte della versione gratuita

Fanky Fanky
10 gen 2025 12:42:31