метабоксы не сохраняют данные html в wordpress

Я использую этот скрипт, приведенный здесь https://github.com/awshout/Custom-WordPress-Meta-Boxes/tree/master/metaboxes

он работает нормально, но проблема в том, что он не сохраняет html-коды/теги. Когда я пишу тест, все в порядке, но когда я помещаю любой html-код в обычные текстовые области или c ustom wp_editor, он не сохраняет данные.

ниже приведена часть функций для сохранения данных. У вас есть идеи, как заставить его работать для сохранения исходного кода html? спасибо

function save_box( $post_id ) {
    $post_type = get_post_type();
    // verify nonce
    if ( ! isset( $_POST['custom_meta_box_nonce_field'] ) )
        return $post_id;
    if ( ! ( in_array( $post_type, $this->page ) || wp_verify_nonce( $_POST['custom_meta_box_nonce_field'],  'custom_meta_box_nonce_action' ) ) ) 
        return $post_id;
    // check autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;
    // check permissions
    if ( ! current_user_can( 'edit_page', $post_id ) )
        return $post_id;

    // loop through fields and save the data
    foreach ( $this->fields as $field ) {
        if( $field['type'] == 'section' ) {
            $sanitizer = null;
            continue;
        }
        if( in_array( $field['type'], array( 'tax_select', 'tax_checkboxes' ) ) ) {
            // save taxonomies
            if ( isset( $_POST[$field['id']] ) ) {
                $term = $_POST[$field['id']];
                wp_set_object_terms( $post_id, $term, $field['id'] );
            }
        }
        else {
            // save the rest
            $new = false;
            $old = get_post_meta( $post_id, $field['id'], true );
            if ( isset( $_POST[$field['id']] ) )
                $new = $_POST[$field['id']];
            if ( isset( $new ) && '' == $new && $old ) {
                delete_post_meta( $post_id, $field['id'], $old );
            } elseif ( isset( $new ) && $new != $old ) {
                $sanitizer = isset( $field['sanitizer'] ) ? $field['sanitizer'] : 'sanitize_text_field';
                if ( is_array( $new ) )
                    $new = meta_box_array_map_r( 'meta_box_sanitize', $new, $sanitizer );
                else
                    $new = meta_box_sanitize( $new, $sanitizer );
                update_post_meta( $post_id, $field['id'], $new );
            }
        }
    } // end foreach
}

person Community    schedule 12.09.2016    source источник
comment
Как правило, дезинфицирующее средство удаляет html из текстовых входов. Взгляните на эту функцию: meta_box_sanitize() и посмотрите, что она делает для очистки текста. Это может быть место, где удаляется html-контент.   -  person William Patton    schedule 12.09.2016
comment
Глядя на функции очистки сценариев метабоксов, я вижу, что большинство дезинфицирующих средств удаляют html-контент. Какой $sanitizer установлен во время обновления?   -  person William Patton    schedule 12.09.2016
comment
спасибо, да, я проверяю и пытаюсь отключить, но пока не могу найти решение. Я хочу навсегда отключить sanitier   -  person    schedule 12.09.2016
comment
они также добавили возможность использовать визуальный редактор, но он не работает после сохранения сообщения, он удаляет все данные html   -  person    schedule 12.09.2016
comment
ближе к концу вашего кода попробуйте установить дезинфицирующее средство на что-то более подходящее для HTML, например $sanitizer = 'wp_kses_post'. Это позволит пройти некоторому html. Протестируйте сохранение метабокса еще раз с чем-то вроде тега <p>....</p> или ссылкой в ​​нем и посмотрите, сохраняется ли он.   -  person William Patton    schedule 12.09.2016
comment
Уильям, спасибо, я пробовал некоторые методы, как вы сказали, я заменил под foreach ( $this->fields as $field ) {, но это делает ту же проблему и не сохраняет как html   -  person    schedule 12.09.2016
comment
Давайте продолжим обсуждение в чате.   -  person William Patton    schedule 12.09.2016


Ответы (1)


Проблема здесь в том, что функции очистки по умолчанию, которые используются сценарием метабоксов, удаляют html-контент из вашего ввода.

Приведенный ниже код решит эту проблему, заявив, что вы хотите использовать другое дезинфицирующее средство.

function save_box( $post_id ) {
    $post_type = get_post_type();
    // verify nonce
    if ( ! isset( $_POST['custom_meta_box_nonce_field'] ) )
        return $post_id;
    if ( ! ( in_array( $post_type, $this->page ) || wp_verify_nonce( $_POST['custom_meta_box_nonce_field'],  'custom_meta_box_nonce_action' ) ) ) 
        return $post_id;
    // check autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;
    // check permissions
    if ( ! current_user_can( 'edit_page', $post_id ) )
        return $post_id;

    // loop through fields and save the data
    foreach ( $this->fields as $field ) {
        if( $field['type'] == 'section' ) {
            $sanitizer = null;
            continue;
        }
        if( in_array( $field['type'], array( 'tax_select', 'tax_checkboxes' ) ) ) {
            // save taxonomies
            if ( isset( $_POST[$field['id']] ) ) {
                $term = $_POST[$field['id']];
                wp_set_object_terms( $post_id, $term, $field['id'] );
            }
        }
        else {
            // save the rest
            $new = false;
            $old = get_post_meta( $post_id, $field['id'], true );
            if ( isset( $_POST[$field['id']] ) )
                $new = $_POST[$field['id']];
            if ( isset( $new ) && '' == $new && $old ) {
                delete_post_meta( $post_id, $field['id'], $old );
            } elseif ( isset( $new ) && $new != $old ) {
                // the code below is commented out and replaced with a line that specifically sets the sanitizer to one that will keep some html
                //$sanitizer = isset( $field['sanitizer'] ) ? $field['sanitizer'] : 'sanitize_text_field';
                $sanitizer = 'wp_kses_post'
                if ( is_array( $new ) )
                    $new = meta_box_array_map_r( 'meta_box_sanitize', $new, $sanitizer );
                else
                    $new = meta_box_sanitize( $new, $sanitizer );
                update_post_meta( $post_id, $field['id'], $new );
            }
        }
    } // end foreach
}

Обратите внимание, что, хотя это работает для вашей ситуации, это также означает, что все остальные метабоксы будут проходить через это же дезинфицирующее средство, когда есть лучшие альтернативы, которые можно использовать для других типов данных.

person William Patton    schedule 12.09.2016
comment
Это блестящее решение. Спасибо. - person Lenin Zapata; 04.11.2018