Статьи

Добавление мета-блоков для публикации типов в WordPress

Если вы когда-либо использовали 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 и как их ограничить типами записей.

Мы также рассмотрели, как добавлять поля формы в мета-поле и как сохранять данные, введенные в него при сохранении или публикации сообщения.

Наконец, мы рассмотрели, как использовать на практике данные, введенные в метаблок.

В следующей статье мы расскажем, как добавить вкладку контекстной справки на административные экраны типов сообщений.

Если у вас есть какие-либо вопросы или предложения, мы будем рады их услышать в комментариях.