web-dev-qa-db-ja.com

このクイック編集チェックボックスがオフの場合にのみ値を保存するのはなぜですか?

wp-admin/edit.phpの投稿リストの各投稿のクイック編集領域にチェックボックスを作成するために以下の関数のグループを使用しています。これはheadline_newsという名前のカスタムフィールドに値を保存します。

問題は、チェックボックスがチェックされているとき、クイック編集は値を保存しますが、チェックされたボックスのチェックを外すと再び保存されません。 PHPMyAdminを使用すると、チェックボックスを保存するときにカスタムフィールドの値がデータベース内で変更されますが、チェックボックスをオフにして保存するときに変更されません。

最初の3つの関数は、列を追加し、列の内容をエコーし​​、チェックボックスを印刷するという、かなり標準的なものです。チェックされていないボックスを保存しないという問題は、Javascriptの保存機能に含まれている必要があります。

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

編集1/23/17

Save関数の一部をこれに変更しても動作します。

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

                }

それは私がクイック編集からカスタムフィールドを保存して削除することを可能にします。しかし、 フル投稿エディタ - テキストの編集、カテゴリの変更などで投稿を編集すると、カスタムフィールドが削除されます。では、なぜそれが起こっているのでしょうか。このメタフィールドを変更しないようにフル投稿エディタで保存し続けるにはどうすればよいですか。

そして:なぜクイック編集に2つのチェックボックスフィールドがあるのですか?:

enter image description here 

2
BlueDogRanch

なぜ修正が必要なのか?[投稿の編集]画面でheadline_newsメタデータが削除されるのはなぜですか。

投稿編集画面を使用するときはheadline_newsが設定されていないため、qedit_save_post()関数は$_POST['headline_news']を踏みます。

カスタムフィールドエディタはheadline_newsに使用されており、カスタムメタボックスは含まれていないので、組み込みカスタムフィールドエディタにメタデータの保存を処理させ、Editを使用するときに意図的にクイック編集保存ロジックを起動しません投稿画面例えば。:

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

重複した ヘッドラインニュースの位置 チェックボックスと修正

最初は Headline news position というチェックボックスが重複して表示されていましたが、元のコードでquick_edit_add()関数の$column_nameがチェックされていないことに気付きました。 quick_edit_custom_box actionは各カスタム列に対して1回呼び出されるので、実際には複数のカスタム列が投稿リストに追加されていて、このコードは元の質問の一部ではなかった(列はプラグインやテーマを介して追加することができます)。適切な列のチェックを追加して、出力が各列に対して1回だけレンダリングされるようにすることができます。

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

完全な解決策:

これは、上記の投稿編集画面の修正、 見出しのニュースの位置 チェックボックスの重複の修正、および主に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