Простой metabox с чекбоксом (checkbox)


Понадобилось в админке для модуля плагина по поиску работы добавить функцию выделения "горячих" вакансий. Решилась проблема с помощью простого кода для создания метабокса. Весь код выглядит следующим образом:

add_action( 'add_meta_boxes', 'add_custom_box' );

    function add_custom_box( $post ) {
        add_meta_box(
            'Meta Box', // ID, should be a string.
            'Featured People', // Meta Box Title.
            'people_meta_box', // Your call back function, this is where your form field will go.
            'jobpost', // The post type you want this to show up on, can be post, page, or custom post type.
            'side', // The placement of your meta box, can be normal or side.
            'core' // The priority in which this will be displayed.
        );
}

  function people_meta_box($post) {
    wp_nonce_field( 'my_awesome_nonce', 'awesome_nonce' );    
    $checkboxMeta = get_post_meta( $post->ID );
    ?>

    <input type="checkbox" name="hot" id="hot" value="yes" <?php if ( isset ( $checkboxMeta['hot'] ) ) checked( $checkboxMeta['hot'][0], 'yes' ); ?> />HOT<br />

<?php }

add_action( 'save_post', 'save_people_checkboxes' );
    function save_people_checkboxes( $post_id ) {
        if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
            return;
        if ( ( isset ( $_POST['my_awesome_nonce'] ) ) && ( ! wp_verify_nonce( $_POST['my_awesome_nonce'], plugin_basename( __FILE__ ) ) ) )
            return;
        if ( ( isset ( $_POST['post_type'] ) ) && ( 'page' == $_POST['post_type'] )  ) {
            if ( ! current_user_can( 'edit_page', $post_id ) ) {
                return;
            }    
        } else {
            if ( ! current_user_can( 'edit_post', $post_id ) ) {
                return;
            }
        }

        //saves hot's value
        if( isset( $_POST[ 'hot' ] ) ) {
            update_post_meta( $post_id, 'hot', 'yes' );
        } else {
            update_post_meta( $post_id, 'hot', 'no' );
        } 
}

Обратите внимание на этот участок кода - тут я применяю метабокс для типа поста jobpost

'jobpost', // The post type you want this to show up on, can be post, page, or custom post type.

если вам нужно для обычных - меняем на post

ПОЛЕЗНО  Скрипт сжатия HTML / Minify HTML

После всей этой установки у нас в админке появляется новый чекбокс:

Простой metabox с чекбоксом (checkbox)

Простой metabox с чекбоксом (checkbox)

И уже внутри шаблонов мы можем проверять чекбокс вот таким кодом:


$hot_job = get_post_meta( get_the_ID(), 'hot', true );
if (!empty($hot_job) && $hot_job == 'yes') {
    $hot_css_class = 'ax-hot-job3';
}

т.е. по коду я делаю проверку, что бы чекбокс был активирован и создаю переменную с названием класс для стилей. А дальше по коду уже добавляю вывод этого класса:

<div id="sjb_job-heading2" class="h1 <?php echo $hot_css_class; ?>">

вот и все 🙂

Обновлено 12.01.207

И вот возникла ситуация, когда на главной странице сайта выводятся новости и как-то нужно фильтровать (скрывать) с главной новости определенных партенеров. Метабокс то мы добавили, теперь будем его фильтровать в запросе к базе. По этому поводу даже есть хорошая статья (не буду ее здесь всю цитировать). Дополню только одно, что значения можно еще указывать в виде массива:

'meta_query' => array(
    array(
        'key' => 'some_key',
        'value'   => array(''),
        'compare' => 'NOT IN'
    )
)

И вроде бы все хорошо и должно работать, но нет - у нас же для старых постов не создано это кастомное значение. Будем исправлять ситуацию! Итак - добавляем новое кастомное поле с определенным значением ко всем постам (Add custom fields to existing posts). Код такой (запускать нужно в phpMyAdmin на вкладке sql):

INSERT INTO wp_postmeta( post_id, meta_key, meta_value ) 
SELECT wp_posts.ID,  'municipi',  ''
FROM wp_posts
WHERE wp_posts.post_status =  'publish'
AND wp_posts.post_type =  'post'

найдено было тут. описание: Here I'm updating all the posts that are with the status publish and are type post, and I'm creating a custom field called municipi with initial value empty. После этих манипуляций наша выборка заработала! Единственное что - для тех постов, где вы вручную уже поставили чекбокс - необходимо его еще раз переактивировать.

ПОЛЕЗНО  Использование протокола Open Graph