Роль администратора в мультисайте WordPress удаляет контент при сохранении страниц

У меня настроен мультисайт WordPress, и я пытаюсь сохранить содержимое страницы с атрибутами данных в некоторых тегах html. Суперпользователи могут сохранять без проблем, однако при сохранении администраторов или более низких ролей удаляются атрибуты данных, содержащиеся в теге. Есть ли способ разрешить другим ролям пользователей сохранять атрибуты данных в html?

Просто для ясности: удаляются не сами HTML-теги, а атрибуты данных, например:

<p data-item="1">String</p>

Вышеприведенное сохраняется как:

<p>String</p>

Это также не проблема tinymce, я сканирую переключатель туда и обратно между WYSIWYG и исходным представлением, и он остается, только когда я сохраняю страницу, она удаляется, и только для пользователей, которые ниже, чем суперпользователь в мультисайт.

Любая помощь приветствуется, спасибо!


person brm252    schedule 31.07.2018    source источник


Ответы (3)


У вас возникла проблема с возможностью unfiltered_html. Если вы прочитаете эту ссылку на кодекс, вы заметите следующее:

Примечание. В мультисайте WordPress только суперадминистраторы имеют возможность unfiltered_html.

Чтобы обойти это, вам нужно добавить возможность unfiltered_html к роли administrator. Если вы не знаете, как это сделать, продолжайте читать:

Вам потребуется использовать функцию add_cap(). Что-то вроде следующего должно быть достаточно. Если вся ваша сеть использует одну тему, вы можете вставить следующий код в файл functions.php активной темы.

В противном случае вы можете использовать обязательный подключаемый модуль — создайте файл типа custom-functions.php, вставьте в него следующий код и поместите его в /wp-content/mu-plugins/ (создайте его, если он еще не существует). Это сделает его «обязательным для использования плагином», который всегда загружается, несмотря ни на что, и не может быть активирован/деактивирован.

function so_51604149_add_cap(){
    $role = get_role( 'administrator' );

    if( $role ){
        $role->add_cap( 'unfiltered_html' ); 
    }
}
add_action( 'init', 'so_51604149_add_cap' );

В качестве альтернативы, существует смесь плагинов типа «права пользователя» и «роли пользователя», которые могут помочь. Суть вашей проблемы в том, что суперадминистраторы — единственная роль в WordPress MultiSite с возможностью unfiltered_html.

person Xhynk    schedule 31.07.2018

Xhynk привел меня к этому решению, спасибо!

Возможность unfiltered_html устарела, поэтому, чтобы имитировать действие этой возможности, я добавил в свой код следующее:

add_action( 'init', 'kses_unfiltered_html' );
function kses_unfiltered_html() {
    $user = wp_get_current_user();

    if ( current_user_can('edit_pages') )
        kses_remove_filters();
}

Это то, что мне нужно, это позволяет любым пользователям, которые могут редактировать страницы, сохранять контент без фильтрации. Другим может понадобиться роль вместо edit_pages, например:

add_action( 'init', 'kses_unfiltered_html' );
function kses_unfiltered_html() {
    $user = wp_get_current_user();

    if ( current_user_can('administrator') )
        kses_remove_filters();
}
person brm252    schedule 31.07.2018

Этот фильтр работал для меня:

// Add the unfiltered_html capability back in to WordPress 3.0 multisite. o(8MNTW9B2WUi(ITf8N&0rc$
function allow_unfiltered_html_multisite( $caps, $cap, $user_id, $args ) {
    if ( $user_id !== 0 && $cap === 'unfiltered_html' ) {
        $user_meta = get_userdata($user_id);
        if ( in_array( 'administrator', $user_meta->roles, true ) ) {
            // Re-add the cap
            unset( $caps );
            $caps[] = $cap;
        }
    }
    return $caps;
}
add_filter('map_meta_cap', 'allow_unfiltered_html_multisite', 10, 4 );```
person 3eighty    schedule 04.03.2019