Custom field внутри submitbox

Довольно часто для сайтов на wordpress мне нужны дополнительные поля, и не всегда ради одного поля хочется создавать meta box, так вот пришла в голову идея поискать место более удобное для этого место.

Под зоркий глаз попала область с настройками публикации поста и кнопкой Опубликовать. Не долго думая после безуспешных попыток поиска по кодексу я полез смотреть ядро, и, как и предполагал, нашел там действие post_submitbox_misc_actions которое вызывается при выводе нужного нам мета-бокса. Внутрь него я поместил вывод чекбокса с нехитрой разметкой, чтобы все выглядело лаконично.

/**
 * Custom field in submitbox.
 * Displayed after all other options but before submit button.
 */
function htmlandcms_post_submitbox_misc_action() {
    global $post;
    $best = ( isset( $post->best ) && $post->best ) ? 'checked="checked"' : ''; ?>
    <div>
        <label for="best">
            <input type="checkbox" id="best" name="best" <?php echo $best; ?>/>
            <?php _e( 'Mark as best post' ); ?>
        </label>
    </div><?php 
}

add_action( 'post_submitbox_misc_actions', 'htmlandcms_post_submitbox_misc_action' );

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


/**
 * Save show on front field action callback.
 */
function htmlandcms_front_page_field( $post_id, $post ) {
    if ( ( !defined( 'DOING_AUTOSAVE' ) && !DOING_AUTOSAVE ) || ( !current_user_can( 'edit_page', $post_id ) ) ) {
        return $post_id;
    }

    $id = 'best'; // аттрибут name поля

    // если есть POST данные для поля
    if ( isset( $_POST[$id] ) ) {
        // и если мета информация еще не установлена у поста
        if ( ! $post->$id ) 
            update_post_meta( $post_id, $id, $_POST[$id] );
    }
    // но если нет POST данных при сохранении, а метаданные у поста установлены то удаляем
    elseif ( isset( $post->$id ) ) {
        delete_post_meta( $post_id, $id );
    }
}

add_action( 'save_post', 'htmlandcms_front_page_field', 10, 2 );

И остался пример вывода постов отмеченных как лучшие, для этого в аргументы к query_posts добавляем мета информацию:


query_posts( array(
    // ...
    'meta_key' => 'best',
    'meta_compare' => 'EXISTS',
));

Таким образом выведутся только те посты у которых существуют мета информация с ключом best.
Вот и все, have fun 😉

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *