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

Да, верно, вам понадобится Пользовательское мета-поле, которое создаст чекбоксы на экране редактирования записи.
В данном случае это будут радиокнопки, так как нам нужно только одно значение.
Ниже приведен код, который создает это поле. Поместите его в файл 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>

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

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

Работа @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
в выпадающем списке произвольных полей и укажите название цвета в поле значение
.
