Skip to content

Instantly share code, notes, and snippets.

@pavlo-bondarchuk
Last active January 30, 2020 13:35
Show Gist options
  • Select an option

  • Save pavlo-bondarchuk/4f063efef17c15585ca8d63d9b475528 to your computer and use it in GitHub Desktop.

Select an option

Save pavlo-bondarchuk/4f063efef17c15585ca8d63d9b475528 to your computer and use it in GitHub Desktop.
class MetaBox
class trueMetaBox {
function __construct($options) {
$this->options = $options;
$this->prefix = $this->options['id'] .'_';
add_action( 'add_meta_boxes', array( &$this, 'create' ) );
add_action( 'save_post', array( &$this, 'save' ), 1, 2 );
}
function create() {
foreach ($this->options['post'] as $post_type) {
if (current_user_can( $this->options['cap'])) {
add_meta_box($this->options['id'], $this->options['name'], array(&$this, 'fill'), $post_type, $this->options['pos'], $this->options['pri']);
}
}
}
function fill(){
global $post; $p_i_d = $post->ID;
wp_nonce_field( $this->options['id'], $this->options['id'].'_wpnonce', false, true );
?>
<table class="form-table"><tbody><?php
foreach ( $this->options['args'] as $param ) {
if (current_user_can( $param['cap'])) {
?><tr><?php
if(!$value = get_post_meta($post->ID, $this->prefix .$param['id'] , true)) $value = $param['std'];
switch ( $param['type'] ) {
case 'text':{ ?>
<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
<td>
<input name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>" id="<?php echo $this->prefix .$param['id'] ?>" value="<?php echo $value ?>" placeholder="<?php echo $param['placeholder'] ?>" class="regular-text" /><br />
<span class="description"><?php echo $param['desc'] ?></span>
</td>
<?php
break;
}
case 'textarea':{ ?>
<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
<td>
<textarea name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>" id="<?php echo $this->prefix .$param['id'] ?>" value="<?php echo $value ?>" placeholder="<?php echo $param['placeholder'] ?>" class="large-text" /><?php echo $value ?></textarea><br />
<span class="description"><?php echo $param['desc'] ?></span>
</td>
<?php
break;
}
case 'checkbox':{ ?>
<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
<td>
<label for="<?php echo $this->prefix .$param['id'] ?>"><input name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>" id="<?php echo $this->prefix .$param['id'] ?>"<?php echo ($value=='on') ? ' checked="checked"' : '' ?> />
<?php echo $param['desc'] ?></label>
</td>
<?php
break;
}
case 'select':{ ?>
<th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th>
<td>
<label for="<?php echo $this->prefix .$param['id'] ?>">
<select name="<?php echo $this->prefix .$param['id'] ?>" id="<?php echo $this->prefix .$param['id'] ?>"><option>...</option><?php
foreach($param['args'] as $val=>$name){
?><option value="<?php echo $val ?>"<?php echo ( $value == $val ) ? ' selected="selected"' : '' ?>><?php echo $name ?></option><?php
}
?></select></label><br />
<span class="description"><?php echo $param['desc'] ?></span>
</td>
<?php
break;
}
}
?></tr><?php
}
}
?></tbody></table><?php
}
function save($post_id, $post){
if ( !wp_verify_nonce( $_POST[ $this->options['id'].'_wpnonce' ], $this->options['id'] ) ) return;
if ( !current_user_can( 'edit_post', $post_id ) ) return;
if ( !in_array($post->post_type, $this->options['post'])) return;
foreach ( $this->options['args'] as $param ) {
if ( current_user_can( $param['cap'] ) ) {
if ( isset( $_POST[ $this->prefix . $param['id'] ] ) && trim( $_POST[ $this->prefix . $param['id'] ] ) ) {
update_post_meta( $post_id, $this->prefix . $param['id'], trim($_POST[ $this->prefix . $param['id'] ]) );
} else {
delete_post_meta( $post_id, $this->prefix . $param['id'] );
}
}
}
}
}
$options = array(
array( // первый метабокс
'id' => 'meta1', // ID метабокса, а также префикс названия произвольного поля
'name' => 'Доп. настройки 1', // заголовок метабокса
'post' => array('post'), // типы постов для которых нужно отобразить метабокс
'pos' => 'normal', // расположение, параметр $context функции add_meta_box()
'pri' => 'high', // приоритет, параметр $priority функции add_meta_box()
'cap' => 'edit_posts', // какие права должны быть у пользователя
'args' => array(
array(
'id' => 'field_1', // атрибуты name и id без префикса, например с префиксом будет meta1_field_1
'title' => 'Текст', // лейбл поля
'type' => 'text', // тип, в данном случае обычное текстовое поле
'placeholder' => 'плейсхолдер, например введите email', // атрибут placeholder
'desc' => 'пример использования текстового поля ввода в метабоксе', // что-то типа пояснения, подписи к полю
'cap' => 'edit_posts'
),
array(
'id' => 'terms',
'title' => 'Чекбокс',
'type' => 'checkbox', // чекбокс
'desc' => 'пример чекбокса',
'cap' => 'edit_posts'
),
array(
'id' => 'textfield',
'title' => 'Текстовое поле',
'type' => 'textarea', // большое текстовое поле
'placeholder' => 'сюда тоже можно забацать плейсхолдер',
'desc' => 'пример использования большого текстового поля ввода в метабоксе',
'cap' => 'edit_posts'
),
array(
'id' => 'select1',
'title' => 'Выпадающий список',
'type' => 'select', // выпадающий список
'desc' => 'тут тоже можно написать пояснение к полю, значения же задаются через ассоциативный массив',
'cap' => 'edit_posts',
'args' => array('value_1' => 'Значение 1', '2' => 'Значение 2', 'Значение_3' => 'Значение 3' ) // элементы списка задаются через массив args, по типу value=>лейбл
)
)
),
array( // второй метабокс
'id' => 'meta2',
'name' => 'Доп. настройки 2',
'post' => array('post', 'page'), // не только для постов, но и для страниц
'pos' => 'normal',
'pri' => 'high',
'cap' => 'edit_posts',
'args' => array(
array(
'id' => 'featured',
'title' => 'На главную',
'desc' => 'Отображать пост на главной странице',
'type' => 'checkbox',
'cap' => 'edit_posts'
)
)
)
);
foreach ($options as $option) {
$truemetabox = new trueMetaBox($option);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment