Если вы когда-либо использовали WordPress для создания веб-сайта для себя или своего клиента или работаете в компании, веб-сайт которой работает на WordPress, вы бы увидели и использовали мета-блоки.
В прошлом мы рассматривали добавление пользовательских мета-блоков в WordPress . В этой статье мы пойдем на два шага дальше, объясняя их взаимосвязь и интеграцию с типами записей, включая использование данных, сохраненных в мета-блоках в интерфейсе WordPress.
Добавление мета-боксов к экрану типов записей
Большинство (если не все) функций PHP, их параметров и хуков Action
, которые удобны при создании мета-блоков, были рассмотрены Narayan Prusty .
Чтобы добавить мета-поле на экран редактирования любого типа записи, используется add_meta_box()
а затем add_meta_boxes
действию add_meta_boxes
.
Код ниже добавляет метабокс к экрану редактирования записи. Обратите внимание на global_notice_meta_box_callback
, функцию, которая вызывается для отображения полей формы в мета-поле. Мы подойдем к этому позже.
function global_notice_meta_box() { add_meta_box( 'global-notice', __( 'Global Notice', 'sitepoint' ), 'global_notice_meta_box_callback', 'post' ); } add_action( 'add_meta_boxes', 'global_notice_meta_box' );
Для добавления мета-бокса к нескольким экранам типов записей — post
, page
и пользовательский тип записи; создайте массив типов add_meta_box()
итерацию по массиву и используйте add_meta_box()
чтобы добавить к ним add_meta_box()
.
function global_notice_meta_box() { $screens = array( 'post', 'page', 'book' ); foreach ( $screens as $screen ) { add_meta_box( 'global-notice', __( 'Global Notice', 'sitepoint' ), 'global_notice_meta_box_callback', $screen ); } } add_action( 'add_meta_boxes', 'global_notice_meta_box' );
Чтобы добавить мета-блок ко всем существующим типам постов и тем, которые будут созданы в будущем, используйте get_post_types()
чтобы получить массив типов постов, а затем замените им значение $screen
выше.
function global_notice_meta_box() { $screens = get_post_types(); foreach ( $screens as $screen ) { add_meta_box( 'global-notice', __( 'Global Notice', 'sitepoint' ), 'global_notice_meta_box_callback', $screen ); } } add_action( 'add_meta_boxes', 'global_notice_meta_box' );
Добавление мета-блока ко всем существующим и новым типам записей также можно сделать, пропустив третий ( $screen
) аргумент, например, так:
function global_notice_meta_box() { add_meta_box( 'global-notice', __( 'Global Notice', 'sitepoint' ), 'global_notice_meta_box_callback' ); } add_action( 'add_meta_boxes', 'global_notice_meta_box' );
Мета-блок также можно ограничить типом записи (в данном примере — book
), добавив имя типа записи в add_meta_boxes
действия add_meta_boxes
следующим образом:
function global_notice_meta_box() { add_meta_box( 'global-notice', __( 'Global Notice', 'sitepoint' ), 'global_notice_meta_box_callback' ); } add_action( 'add_meta_boxes_book', 'global_notice_meta_box' );
Среди аргументов массива, используемых register_post_type()
для настройки пользовательского типа записи, есть register_meta_box_cb
в котором его значение является функцией обратного вызова, которая вызывается при настройке мета-блоков.
Допустим, мы создали пользовательский тип записи со следующим кодом:
function book_cpt() { $args = array( 'label' => 'Books', 'public' => true, 'register_meta_box_cb' => 'global_notice_meta_box' ); register_post_type( 'book', $args ); } add_action( 'init', 'book_cpt' );
Добавление определения функции add_meta_box()
для создания мета-блока внутри PHP-функции global_notice_meta_box
(значение register_meta_box_cb
выше) добавит мета-бокс на экран редактирования пользовательского типа записи book
.
И снова, вот наш пример функции global_notice_meta_box
.
function global_notice_meta_box() { add_meta_box( 'global-notice', __( 'Global Notice', 'sitepoint' ), 'global_notice_meta_box_callback' ); }
До сих пор мы изучали различные способы регистрации или добавления мета-блоков в WordPress. Нам еще предстоит создать функцию global_notice_meta_box_callback
которая будет содержать поле формы нашего мета-блока.
Ниже приведен код для функции global_notice_meta_box_callback
которая будет включать поле текстовой области в мета-поле.
function global_notice_meta_box_callback( $post ) { // Add a nonce field so we can check for it later. wp_nonce_field( 'global_notice_nonce', 'global_notice_nonce' ); $value = get_post_meta( $post->ID, '_global_notice', true ); echo '<textarea style="width:100%" id="global_notice" name="global_notice">' . esc_attr( $value ) . '</textarea>'; }
save_post
действия save_post
обрабатывает сохранение данных, введенных в текстовую область, когда сообщение сохраняется как черновик или опубликовано.
/** * When the post is saved, saves our custom data. * * @param int $post_id */ function save_global_notice_meta_box_data( $post_id ) { // Check if our nonce is set. if ( ! isset( $_POST['global_notice_nonce'] ) ) { return; } // Verify that the nonce is valid. if ( ! wp_verify_nonce( $_POST['global_notice_nonce'], 'global_notice_nonce' ) ) { return; } // If this is an autosave, our form has not been submitted, so we don't want to do anything. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } // Check the user's permissions. 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; } } /* OK, it's safe for us to save the data now. */ // Make sure that it is set. if ( ! isset( $_POST['global_notice'] ) ) { return; } // Sanitize user input. $my_data = sanitize_text_field( $_POST['global_notice'] ); // Update the meta field in the database. update_post_meta( $post_id, '_global_notice', $my_data ); } add_action( 'save_post', 'save_global_notice_meta_box_data' );
Чтобы поместить данные, которые будут вводиться в текстовую область мета-поля, мы будем отображать их до того, как будет отображен контент публикации, для которого они сохранены.
function global_notice_before_post( $content ) { global $post; // retrieve the global notice for the current post $global_notice = esc_attr( get_post_meta( $post->ID, '_global_notice', true ) ); $notice = "<div class='sp_global_notice'>$global_notice</div>"; return $notice . $content; } add_filter( 'the_content', 'global_notice_before_post' );
Код Объяснение
Сначала мы создали функцию global_notice_before_post
подключенную к фильтру the_content
с параметром $content
который содержит содержимое публикации.
Внутри функции мы включаем глобальную переменную $post
которая содержит объект WP_Post
текущего поста, который просматривается.
Глобальное уведомление, сохраненное для данного сообщения, извлекается get_post_meta
и сохраняется в переменной $global_notice
.
Уведомление затем оборачивается в div
и сохраняется в переменной $notice
.
И, наконец, $notice
которое содержит глобальное уведомление, объединяется с $content
который является фактическим содержимым публикации.
Ниже приведен скриншот сообщения с глобальным уведомлением перед содержанием сообщения.
Резюме
В этом уроке мы узнали, как зарегистрировать мета-блоки на административных экранах WordPress и как их ограничить типами записей.
Мы также рассмотрели, как добавлять поля формы в мета-поле и как сохранять данные, введенные в него при сохранении или публикации сообщения.
Наконец, мы рассмотрели, как использовать на практике данные, введенные в метаблок.
В следующей статье мы расскажем, как добавить вкладку контекстной справки на административные экраны типов сообщений.
Если у вас есть какие-либо вопросы или предложения, мы будем рады их услышать в комментариях.