Понадобилось в админке для модуля плагина по поиску работы добавить функцию выделения "горячих" вакансий. Решилась проблема с помощью простого кода для создания метабокса. Весь код выглядит следующим образом:
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
После всей этой установки у нас в админке появляется новый чекбокс:
И уже внутри шаблонов мы можем проверять чекбокс вот таким кодом:
$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. После этих манипуляций наша выборка заработала! Единственное что - для тех постов, где вы вручную уже поставили чекбокс - необходимо его еще раз переактивировать.