Добавление атрибута placeholder к полям формы комментариев WordPress

23 авг. 2012 г., 05:42:42
Просмотры: 14.9K
Голосов: 4

Я пытаюсь добавить атрибут placeholder="" к полям стандартной формы комментариев WordPress. Не могу разобраться с фильтром. Ошибок не возникает, но и placeholder не отображается.

После часа поиска по форумам я пришел к следующему коду:

function my_fields($args){
        // Получаем данные текущего комментатора
        $commenter = wp_get_current_commenter();
        $user = wp_get_current_user();
        $user_identity = $user->exists() ? $user->display_name : '';

        // Проверяем, обязательны ли поля имени и email
        $req = get_option( 'require_name_email' );
        $aria_req = ( $req ? " aria-required='true'" : '' );
    // Добавляем placeholder к полю автора
    $fields['author'] = '<input id="author" placeholder="имя" name="author" type="text" value="' 
    . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>';

    return $args;
}

// Добавляем наш фильтр к форме комментариев
add_filter('comment_form', 'my_fields');

Я пробовал множество вариантов и пытался возвращать разные значения, но пока безрезультатно.

0
Все ответы на вопрос 2
7

Вам следует отфильтровать хук 'comment_form_default_fields', чтобы добавить атрибут placeholder.

Пример кода

add_filter( 'comment_form_default_fields', 'wpse_62742_comment_placeholders' );

/**
 * Изменяет стандартные поля, добавляет placeholder и изменяет типы атрибутов.
 *
 * @param  array $fields
 * @return array
 */
function wpse_62742_comment_placeholders( $fields )
{
    $fields['author'] = str_replace(
        '<input',
        '<input placeholder="'
        /* Замените 'theme_text_domain' на текстовый домен вашей темы.
         * Я использую _x() здесь, чтобы облегчить жизнь переводчикам. :)
         * См. http://codex.wordpress.org/Function_Reference/_x
         */
            . _x(
                'Имя и фамилия или никнейм',
                'плейсхолдер формы комментария',
                'theme_text_domain'
                )
            . '"',
        $fields['author']
    );
    $fields['email'] = str_replace(
        '<input id="email" name="email" type="text"',
        /* Мы используем правильный атрибут type, чтобы воспользоваться
         * встроенной валидацией браузера и получить соответствующую клавиатуру на смартфонах.
         */
        '<input type="email" placeholder="contact@example.com"  id="email" name="email"',
        $fields['email']
    );
    $fields['url'] = str_replace(
        '<input id="url" name="url" type="text"',
        // Опять же: лучшее значение атрибута 'type'.
        '<input placeholder="http://example.com" id="url" name="url" type="url"',
        $fields['url']
    );

    return $fields;
}

Результат

пример формы с плейсхолдерами

Несколько замечаний

  • Не используйте placeholder вместо label. Пользователи скринридеров будут очень недовольны. Да и вообще это не разрешено.
  • Я также изменил атрибут type. Это поможет вашим посетителям больше, чем placeholder.
  • Убедитесь, что поля не выглядят уже заполненными. Но постарайтесь обеспечить читаемый контраст. Да, это непросто. Вы можете использовать CSS, но это работает не во всех браузерах.
23 авг. 2012 г. 06:48:31
Комментарии

Большое спасибо. Работает отлично. Я также пробовал comment_form_default_fields. Просто ничего не видел. Ни ошибок, но и никаких результатов.

Jamie Jamie
24 авг. 2012 г. 02:56:48

Это не работает с полями "email", "url" и "comment" в WP3.6 beta 4. Думаю, что простой str_replace() не очень надежен и перспективен. Он работает только для "author", потому что тип поля не заменяется на HTML5 input типы. Мой совет всем, кто это делает: замените <input на <input placeholder="", и, надеюсь, WordPress скоро сам изменит type="".

Atadj Atadj
22 июн. 2013 г. 17:54:09

@Paul Тогда проверяйте только атрибут name. Да, парсер DOM был бы надежнее.

fuxia fuxia
22 июн. 2013 г. 17:57:46

@toscho Да, str_replace( 'name="email"', 'placeholder="contact@example.com" name="email"', $fields['email'] ); должно отлично работать долгое время! Спасибо за этот полезный ответ!

Atadj Atadj
22 июн. 2013 г. 18:00:11

Есть еще один момент, который меня озадачивает: массив состоит из "author", "url" и "email". У кого-нибудь есть идеи, как получить доступ к текстовому полю "comment"?

Atadj Atadj
22 июн. 2013 г. 18:08:16

@Paul Смотрите этот ответ.

fuxia fuxia
22 июн. 2013 г. 18:10:17

@toscho Спасибо! Я не знаю, кто вы, но ваша помощь всегда бесценна :) Теперь этот ответ содержит всё, что может понадобиться другим людям для редактирования своих полей!

Atadj Atadj
22 июн. 2013 г. 18:15:46
Показать остальные 2 комментариев
0

Думаю, вам нужен этот фильтр:

comment_form_default_fields

Также можно работать с конкретным полем:

comment_form_field_$name

Для справки:

http://codex.wordpress.org/Function_Reference/comment_form

23 авг. 2012 г. 06:26:09