web-dev-qa-db-fra.com

Pourquoi cette case à cocher Modification rapide enregistre-t-elle la valeur uniquement lorsqu'elle est décochée?

J'utilise le groupe de fonctions ci-dessous pour créer une case à cocher dans la zone d'édition rapide de chaque publication dans la liste de publication en wp-admin/edit.php qui enregistre une valeur dans un champ personnalisé appelé headline_news.

Le problème est que lorsque la case à cocher est cochée, Quick Edit enregistre la valeur, mais il ne sera pas enregistré à nouveau lorsque je décoche une case à cocher. Via PHPMyAdmin, la valeur du champ personnalisé change dans la base de données lors de l’enregistrement d’une case cochée, mais ne change pas lors de la désélection d’une case et de l’enregistrement.

Les trois premières fonctions sont assez classiques pour ajouter une colonne, afficher son contenu et imprimer la case à cocher. J'imagine que le problème avec le fait de ne pas enregistrer une case non cochée doit être dans la fonction d'enregistrement dans les Javascripts.

// Add column to posts listing

add_filter( 'manage_post_posts_columns', 'add_columns' );
function add_columns( $columns ) {

    $columns['headline_news'] = 'Headline news';
    return $columns;
}


// Echo contents of custom field in column

add_action( 'manage_posts_custom_column', 'columns_content', 10, 2 );
 function columns_content( $column_name, $post_id ) {

    if( $column_name == 'headline_news' ) {
        $headline_news = get_post_meta( $post_id, 'headline_news', true );
        echo $headline_news ;
}
}



// Print checkbox in Quick Edit

add_action( 'quick_edit_custom_box', 'quick_edit_add', 10, 2 );
function quick_edit_add( $column_name, $post_type ) {

    printf( '
        <input type="checkbox" name="headline_news" class="headline_news"> %s',
        'Headline news position'
    );
}



// Save checkbox value

add_action( 'save_post', 'qedit_save_post', 10, 2 );
function qedit_save_post( $post_id, $post ) {

    // pointless if $_POST is empty (this happens on bulk edit)
    if ( empty( $_POST ) )
        return $post_id;

    // verify quick edit nonce
    if ( isset( $_POST[ '_inline_edit' ] ) && ! wp_verify_nonce( $_POST[ '_inline_edit' ], 'inlineeditnonce' ) )
        return $post_id;

    // don't save for autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // dont save for revisions
    if ( isset( $post->post_type ) && $post->post_type == 'revision' )
        return $post_id;

     // Save only the custom field

            $custom_fields = array( 'headline_news' );

            foreach( $custom_fields as $field ) {

                if ( array_key_exists( $field, $_POST ) )
                    update_post_meta( $post_id, $field, $_POST[ $field ] );

            }
}





//  Javascript functions to set/update checkbox

add_action( 'admin_footer', 'quick_edit_javascript' );
 function quick_edit_javascript() {

    global $current_screen;
    if ( 'post' != $current_screen->post_type )
    {
        return;
    }
    ?>
    <script type="text/javascript">
        function checked_headline_news( fieldValue )
        {
            inlineEditPost.revert();
            jQuery( '.headline_news' ).attr( 'checked', 0 == fieldValue ? false : true );
        }
    </script>
    <?php
}


add_filter( 'post_row_actions', 'expand_quick_edit_link', 10, 2 );
function expand_quick_edit_link( $actions, $post ) {

    global $current_screen;

    $data = get_post_meta( $post->ID, 'headline_news', true );
    $data = empty( $data ) ? 0 : 1;
    $actions['inline hide-if-no-js']    = '<a href="#" class="editinline" title="';
    $actions['inline hide-if-no-js']    .= esc_attr( 'Edit this item inline' ) . '"';
    $actions['inline hide-if-no-js']    .= " onclick=\"checked_headline_news('{$data}')\" >";
    $actions['inline hide-if-no-js']    .= 'Quick Edit';
    $actions['inline hide-if-no-js']    .= '</a>';

    return $actions;
}

Edit 1/23/17

Changer une partie de la fonction de sauvegarde à ceci fonctionne maintenant:

    // Save only the custom field

   if (isset($_POST['headline_news'])) {

                    update_post_meta( $post_id, 'headline_news', 'yes' );

                        } else {

                    delete_post_meta( $post_id, 'headline_news' );

                }

Cela me permet de sauvegarder et de supprimer le champ personnalisé de l'édition rapide. Mais, lorsque je modifie un article dans la éditeur de publication complète - modifier le texte, changer de catégorie, etc. - le champ personnalisé est supprimé. Alors pourquoi cela se passe-t-il? Comment puis-je continuer à sauvegarder dans le post-éditeur complet de changer ce champ méta?

Et: pourquoi y a-t-il deux champs de case à cocher dans l'édition rapide ?:

 enter image description here 

2
BlueDogRanch

Pourquoi les métadonnées de headline_news sont-elles supprimées dans l'écran Modifier une publication, avec un correctif?

La fonction qedit_save_post() saute sur headline_news car $_POST['headline_news'] n'est pas défini lors de l'utilisation de l'écran de post-édition.

Étant donné que l'éditeur de champs personnalisés est utilisé pour headline_news et qu'il n'y a pas de méta-boîte personnalisée impliquée, nous allons laisser l'éditeur de champs personnalisé intégré gérer la sauvegarde des métadonnées et ne déclencher délibérément PAS la logique de sauvegarde rapide lors de la modification. Écran de publication. Par exemple.:

// Handle saving of headline_news via Quick Edit. This code will not fire on the post edit screen.
// The post edit screen will handle the field via the custom field editor.
if ( isset( $_POST[ '_inline_edit' ] ) && wp_verify_nonce( $_POST[ '_inline_edit' ], 'inlineeditnonce' ) ) {
    if ( isset( $_POST['headline_news'] ) ) {   
        update_post_meta( $post_id, 'headline_news', 'yes' );
    } else {
        delete_post_meta( $post_id, 'headline_news' );
    }                   
}

Le dupliqué titre de l'actualité de titre case à cocher et corriger

Au début, j’étais incapable de reproduire le phénomène où vous obteniez un doublon position de l’actualité du titre, mais après un examen plus approfondi, j’ai remarqué que le code original ne vérifiait pas $column_name dans la fonction quick_edit_add(). Le quick_edit_custom_box action est appelé une fois pour chaque colonne personnalisée , je suppose donc que plusieurs colonnes personnalisées ont été ajoutées à vos publications et que ce code ne faisait pas partie de la question initiale (les colonnes pourrait être ajouté via des plugins ou le thème). Nous pouvons ajouter une vérification pour la colonne appropriée afin de nous assurer que la sortie n'est rendue qu'une seule fois pour chaque colonne:

// Print checkbox in Quick Edit for each custom column.
add_action( 'quick_edit_custom_box', 'quick_edit_add', 10, 2 );
function quick_edit_add( $column_name, $post_type ) {
    // Handle the headline_news checkbox

    // Note the added check. This prevents the output from being
    // rendered for every custom column & allows us to handle each individual column.
    switch ( $column_name ) {

        case 'headline_news' :
            printf( '<input type="checkbox" name="headline_news" class="headline_news"> %s',
                    __( 'Headline news position', 'text-domain' )
            );
        break;

        // Example of how another column could be incorporated:
        //case 'another_column' :
            //printf( '<input type="checkbox" name="another_column" class="another_column"> %s',
            //      __( 'Another Column', 'text-domain' )
            //);
        //break;        
    }
}

La solution de travail complète:

Voici le code original avec le correctif de l'écran d'édition mentionné ci-dessus, le correctif pour la case à cocher dupliquée titre de l'actualité de titre, et quelques modifications mineures principalement liées aux normes de codage WordPress.

// Add column to posts listing
add_filter( 'manage_post_posts_columns', 'add_columns' );
function add_columns( $columns ) {
    // Add the Headline News custom column.
    $columns['headline_news'] = __( 'Headline news', 'text-domain' );

    // Perhaps add other custom columns too.
    // $columns['another_column'] = __( 'Another Column', 'text-domain' );

    return $columns;
}

// Echo contents of custom field in column
add_action( 'manage_posts_custom_column', 'columns_content', 10, 2 );
function columns_content( $column_name, $post_id ) {
    switch ( $column_name ) {

        case 'headline_news' :
            $headline_news = get_post_meta( $post_id, 'headline_news', true );
            echo esc_html( $headline_news );
        break;

        // Example of how another column could be incorporated:
        //case 'another_column' :
        //  $another_column = get_post_meta( $post_id, 'another_column', true );
        //  echo esc_html( $another_column );
        //break;
    }
}

// Print checkbox in Quick Edit for each custom column.
add_action( 'quick_edit_custom_box', 'quick_edit_add', 10, 2 );
function quick_edit_add( $column_name, $post_type ) {
    // Handle the headline_news checkbox

    // Note the added check. This prevents the output from being
    // rendered for every custom column & allows us to handle each individual column.
    switch ( $column_name ) {

        case 'headline_news' :
            printf( '<input type="checkbox" name="headline_news" class="headline_news"> %s',
                    __( 'Headline news position', 'text-domain' )
            );
        break;

        // Example of how another column could be incorporated:
        //case 'another_column' :
            //printf( '<input type="checkbox" name="another_column" class="another_column"> %s',
            //      __( 'Another Column', 'text-domain' )
            //);
        //break;        
    }
}

// Save checkbox value
add_action( 'save_post', 'qedit_save_post', 10, 2 );
function qedit_save_post( $post_id, $post ) {
    // exit ( print_r( $_POST ) );
    // Uncomment the above line to see what $_POST contains.

    // pointless if $_POST is empty (this happens on bulk edit)
    if ( empty( $_POST ) ) {
        return $post_id;
    }

    // Verify quick edit nonce
    if ( isset( $_POST[ '_inline_edit' ] ) && ! wp_verify_nonce( $_POST[ '_inline_edit' ], 'inlineeditnonce' ) ) {
        return $post_id;
    }

    // Don't save for autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return $post_id;
    }

    // dont save for revisions
    if ( isset( $post->post_type ) && 'revision' === $post->post_type ) {
        return $post_id;
    }

    // Handle saving of headline_news via Quick Edit. This code will not fire on the post edit screen.
    // The post edit screen will handle the field via the custom field editor.
    if ( isset( $_POST[ '_inline_edit' ] ) && wp_verify_nonce( $_POST[ '_inline_edit' ], 'inlineeditnonce' ) ) {
        if ( isset( $_POST['headline_news'] ) ) {   
            update_post_meta( $post_id, 'headline_news', 'yes' );
        } else {
            delete_post_meta( $post_id, 'headline_news' );
        }                   
    }
}

// JavaScript functions to set/update checkbox
add_action( 'admin_footer', 'quick_edit_javascript' );
function quick_edit_javascript() {
    global $current_screen;
    if ( 'post' !== $current_screen->post_type ) {
        return;
    } ?>
    <script type="text/javascript">
        function checked_headline_news( fieldValue ) {
            inlineEditPost.revert();
            jQuery( '.headline_news' ).attr( 'checked', 0 == fieldValue ? false : true );
        }
    </script><?php
}

add_filter( 'post_row_actions', 'expand_quick_edit_link', 10, 2 );
function expand_quick_edit_link( $actions, $post ) {
    global $current_screen;
    $data = get_post_meta( $post->ID, 'headline_news', true );
    $data = empty( $data ) ? 0 : 1;
    $actions['inline hide-if-no-js']  = '<a href="#" class="editinline"';
    $actions['inline hide-if-no-js'] .=    ' title="' . esc_attr( __( 'Edit this item inline', 'text-domain' ) ) . '"';
    $actions['inline hide-if-no-js'] .=    " onclick=\"checked_headline_news('{$data}')\" >";
    $actions['inline hide-if-no-js'] .=   __( 'Quick Edit', 'text-domain' );
    $actions['inline hide-if-no-js'] .= '</a>';

    return $actions;
}
3
Dave Romsey