Добавить чекбокс на экран редактирования поста для добавления класса к заголовку

7 авг. 2012 г., 00:46:29
Просмотры: 17K
Голосов: 4

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

Спасибо

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

Да, верно, вам понадобится Пользовательское мета-поле, которое создаст чекбоксы на экране редактирования записи.

Пользовательское мета-поле для записи

В данном случае это будут радиокнопки, так как нам нужно только одно значение.

Ниже приведен код, который создает это поле. Поместите его в файл functions.php вашей темы или создайте простой плагин, чтобы это стало независимым от темы.

/* Определяем пользовательское поле */
add_action( 'add_meta_boxes', 'wpse_61041_add_custom_box' );

/* Обрабатываем сохраненные данные */
add_action( 'save_post', 'wpse_61041_save_postdata' );

/* Добавляем блок в основную колонку на экранах редактирования записей и страниц */
function wpse_61041_add_custom_box() {
    add_meta_box( 
        'wpse_61041_sectionid',
        'Цвет заголовка',
        'wpse_61041_inner_custom_box',
        'post',
        'side',
        'high'
    );
}

/* Выводим содержимое блока */
function wpse_61041_inner_custom_box($post)
{
    // Используем nonce для проверки
    wp_nonce_field( 'wpse_61041_wpse_61041_field_nonce', 'wpse_61041_noncename' );

    // Получаем сохраненное значение, если его нет, выбираем "по умолчанию"
    $saved = get_post_meta( $post->ID, 'title_color', true);
    if( !$saved )
        $saved = 'default';

    $fields = array(
        'red'       => __('Красный', 'wpse'),
        'green'     => __('Зеленый', 'wpse'),
        'blue'      => __('Синий', 'wpse'),
        'default'   => __('По умолчанию', 'wpse'),
    );

    foreach($fields as $key => $label)
    {
        printf(
            '<input type="radio" name="title_color" value="%1$s" id="title_color[%1$s]" %3$s />'.
            '<label for="title_color[%1$s]"> %2$s ' .
            '</label><br>',
            esc_attr($key),
            esc_html($label),
            checked($saved, $key, false)
        );
    }
}

/* При сохранении записи сохраняем наши пользовательские данные */
function wpse_61041_save_postdata( $post_id ) 
{
      // Проверяем, не автосохранение ли это
      // Если это автосохранение, форма не отправлялась, и мы ничего не делаем
      if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
          return;

      // Проверяем, что запрос пришел с нашего экрана и с правильной авторизацией,
      // так как save_post может вызываться в других случаях
      if ( !wp_verify_nonce( $_POST['wpse_61041_noncename'], 'wpse_61041_wpse_61041_field_nonce' ) )
          return;

      if ( isset($_POST['title_color']) && $_POST['title_color'] != "" ){
            update_post_meta( $post_id, 'title_color', $_POST['title_color'] );
      } 
}

код основан на этом ответе

Как использовать это в теме

При наличии соответствующих CSS-правил (h1.default, h1.red и т.д.), где бы вы ни хотели применить класс цвета к заголовку (index.php, single.php и т.д.), используйте что-то вроде:

<?php $title_color = get_post_meta( get_the_ID(), 'title_color', true); ?>
<h1 class="entry-title <?php echo esc_attr($title_color); ?>"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
17 нояб. 2012 г. 23:26:15
Комментарии

Хорошо, хорошо. Вам также стоит изучить функцию checked.

chrisguitarguy chrisguitarguy
17 нояб. 2012 г. 23:58:19

@chrisguitarguy, ага, это гениально, намного лучше! ^\o/^

brasofilo brasofilo
18 нояб. 2012 г. 00:26:35

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

chrisguitarguy chrisguitarguy
18 нояб. 2012 г. 00:40:58

@chrisguitarguy : Отлично, следующий раунд за мной, за здоровье!

brasofilo brasofilo
18 нояб. 2012 г. 00:57:28
0

Работа @brasofilo отличная, но если вы не хотите много кодить, то можете сделать то же самое через Произвольные поля. По умолчанию они скрыты. Вы можете сделать их видимыми через Настройки экрана. Создайте новое поле с именем color и укажите название цвета в поле значение. Затем добавьте этот код в файл header.php вашей темы, сразу после закрывающего тега </head>.

<style type="text/css">
/*Замените [color-name] на ваш цвет, например: red*/
#red {color:"red";}
#green {color:"green";}
#[color-name] {color:"[color-name]";}
#[color-name] {color:"[color-name]";}
</style>
    <?php
global $post;
$color = get_post_meta(get_the_ID(), 'color', true);
$id = "id="
?>

Затем найдите <h1 class="entry-title" и добавьте внутрь этот код: <?php echo $id, $color;?>. Теперь, когда вам нужно изменить цвет заголовка, просто выберите поле color в выпадающем списке произвольных полей и укажите название цвета в поле значение.

6 окт. 2013 г. 19:40:14