워드프레스의 사용자 지정 게시 유형에 다중 메타 상자 추가
관리 대시에 커스텀 투고 타입을 추가하고 투고 편집창에 커스텀메타 박스를 추가하는 다음 코드가 있습니다.
function teasers_custom_init() {
$labels = array(
'name' => 'Teasers',
'singular_name' => 'Teaser',
'add_new' => 'Add New',
'add_new_item' => 'Add New Teasers',
'edit_item' => 'Edit Teaser',
'new_item' => 'New Teaser',
'all_items' => 'All Teasers',
'view_item' => 'View Teaser',
'search_items' => 'Search Teasers',
'not_found' => 'No teasers found',
'not_found_in_trash' => 'No teasers found in Trash',
'parent_item_colon' => 'Parent Page',
'menu_name' => 'Teasers'
);
$args = array(
'labels' => $labels,
'description' => 'set slider panels with loop times',
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'Teasers' ),
'capability_type' => 'page',
'has_archive' => true,
'hierarchical' => true,
'menu_position' => 60,
'supports' => array( 'title', 'thumbnail', 'page-attributes'),
);
register_post_type( 'teasers', $args );
}
add_action( 'init', 'teasers_custom_init' );
//adding the meta box when the admin panel initialises
add_action("admin_init", "admin_init");
// this adds the save teaser function on save post
add_action('save_post', 'save_teaser');
function admin_init(){
add_meta_box('teaser_loop', 'Loop Time', 'loop_meta', 'teasers', 'normal', 'default');
}
// callback function of add meta box that displays the meta box in the post edit screen
function loop_meta($post, $args){
$teaser_loop = get_post_meta($post->ID, 'teaser_loop', true);
?>
<label>Teaser Loop: </label><input type="text" name="teaser_loop" value="<?php echo $teaser_loop; ?>" /><br/>
<?php
}
// saving the teaser
function save_teaser(){
global $post;
update_post_meta($post->ID, 'teaser_loop', $_POST['teaser_loop']);
}
질문입니다.메타박스를 추가할 경우 가장 좋은 방법은 무엇입니까?
admin_init 함수에 add_meta_box 콜을 추가하고 이 메타박스 html에 대한 콜백 함수를 추가하려고 했지만 프론트엔드에서 아무것도 생성되지 않았습니다.어떤 조언이라도 좋아요.
편집: 여러 메타 상자에 대해 다음과 같이 작업을 수행했습니다(이 작업은 다음과 같습니다).
//adding the meta box when the admin panel initialises
add_action("admin_init", "admin_init");
// this adds the save teaser function on save post
add_action('save_post', 'save_teaser');
function admin_init(){
add_meta_box('teaser_loop', 'Loop Time', 'loop_meta_1', 'teasers', 'normal', 'default');
add_meta_box('teaser_link', 'Teaser Link', 'loop_meta_2', 'teasers', 'normal', 'default');
}
// back function of add meta box that displays the meta box in the post edit screen
function loop_meta_1($post, $args){
$teaser_loop = get_post_meta($post->ID, 'teaser_loop', true);
?>
<label>Teaser Loop: </label><input type="text" name="teaser_loop" value="<?php echo $teaser_loop; ?>" /><br/>
<?php
}
function loop_meta_2($post, $args){
$teaser_link = get_post_meta($post->ID, 'teaser_link', true);
?>
<label>Teaser Link: </label><input type="text" name="teaser_link" value="<?php echo $teaser_link; ?>" /><br/>
<?php
}
// saving the teaser
function save_teaser(){
global $post;
update_post_meta($post->ID, 'teaser_loop', $_POST['teaser_loop']);
update_post_meta($post->ID, 'teaser_link', $_POST['teaser_link']);
}
클래스에서 완전히 캡슐화할 수 있습니다.여기서는 커스텀 투고 타입의 추가는 취급하지 않습니다.단순한 출력 필드는 텍스트와 체크박스의 2개뿐입니다.완전한 동작 코드는, 필요한 입력 타입을 모두 처리할 필요가 있습니다.
<?php
/**
* Plugin Name: Sample Dynamic Meta Boxes
* Plugin URI: http://stackoverflow.com/q/13903529/1287812
* Author: brasofilo
*/
class B5F_Dynamic_Meta_Boxes
{
private $boxes;
# Safe to start up
public function __construct( $args )
{
$this->boxes = $args;
add_action( 'plugins_loaded', array( $this, 'start_up' ) );
}
public function start_up()
{
add_action( 'add_meta_boxes', array( $this, 'add_mb' ) );
}
public function add_mb()
{
foreach( $this->boxes as $box )
add_meta_box(
$box['id'],
$box['title'],
array( $this, 'mb_callback' ),
$box['post_type'],
isset( $box['context'] ) ? $box['context'] : 'normal',
isset( $box['priority'] ) ? $box['priority'] : 'default',
$box['args']
);
}
# Callback function, uses helper function to print each meta box
public function mb_callback( $post, $box )
{
switch( $box['args']['field'] )
{
case 'textfield':
$this->textfield( $box, $post->ID );
break;
case 'checkbox':
$this->checkbox( $box, $post->ID );
break;
}
}
private function textfield( $box, $post_id )
{
$post_meta = get_post_meta( $post_id, $box['id'], true );
printf(
'<label>%s: <input type="text" name="%s" value="%s" /></label> <small>%s</small><br/>',
$box['title'],
$box['id'],
$post_meta,
$box['args']['desc']
);
}
private function checkbox( $box, $post_id )
{
$post_meta = get_post_meta( $post_id, $box['id'], true );
printf(
'<label>%s: </label><input type="checkbox" name="%s" %s /> <small>%s</small><br/>',
$box['title'],
$box['id'],
checked( 1, $post_meta, false ),
$box['args']['desc']
);
}
}
# ADD TWO META BOXES - DIFFERENT POST TYPES - DIFFERENT CONTEXTS AND PRIORITIES
$args = array(
array(
'id' => 'teaser_loop',
'title' => 'Loop Time',
'post_type' => 'post',
'args' => array(
'desc' => 'Enter the time',
'field' => 'textfield',
)
),
array(
'id' => 'teaser_link',
'title' => 'Loop Link',
'post_type' => 'page',
'context' => 'side',
'priority' => 'high',
'args' => array(
'desc' => 'Open link',
'field' => 'checkbox',
)
),
);
new B5F_Dynamic_Meta_Boxes( $args );
# ADD ANOTHER META BOX TO ANOTHER POST TYPE
$more_args = array(
array(
'id' => 'extra_box',
'title' => 'And another one',
'post_type' => 'teaser',
'args' => array(
'desc' => 'Open link',
'field' => 'textfield',
)
),
);
new B5F_Dynamic_Meta_Boxes( $more_args );
이건 그냥 뼈대일 뿐이야 여기서부터 쓸 게 많아몇 가지 예:
다음 코드를 사용하여 메타박스를 사용자 지정 게시 유형에 추가할 수 있습니다.
먼저 메타박스 생성
add_action('admin_init', 'my_theme_on_admin_init');
function my_theme_on_admin_init() {
add_meta_box('my_metabox',
__('My metabox', 'textdomain'),
'my_metabox_render',
'my_custom_post_type', 'normal', 'high'
);
}
주의해 주세요.my_custom_post_type
커스텀 투고 타입의 이름입니다.my_metabox_render
- 메타박스를 렌더링하는 함수의 이름입니다.
렌더링 함수는 모든 필수 필드를 생성해야 합니다.
function my_metabox_render($post) {
$data = get_post_meta($post->ID, '_meta_key', true);
// Use nonce for verification
wp_nonce_field('add_my_meta', 'my_meta_nonce');
?>
<div class="inside">
<table class="form-table">
<tr valign="top">
<th scope="row"><label for="my_meta_value"><?php _e('My meta', 'textdomain'); ?></label></th>
<td><textarea id="my_meta_value" name="my_meta_value" cols="40" rows="5"><?php echo (isset($data)) ? $data : ''; ?></textarea></td>
</tr>
</table>
</div>
<?php
}
사용자가 게시물을 저장할 때 메타데이터를 업데이트해야 합니다.
add_action('wp_insert_post', 'save_my_meta', 10, 2);
function save_my_meta($id) {
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $id;
if (!current_user_can('edit_posts'))
return;
if (!isset($id))
$id = (int) $_REQUEST['post_ID'];
if (isset($_POST['my_meta_value']) && wp_verify_nonce($_POST['my_meta_value'], 'add_my_meta')) {
$data = $_POST['my_meta_value'];
if (isset($data)) {
update_post_meta($id, '_meta_key', $data);
}
else {
delete_post_meta($id, '_meta_key');
}
}
}
이것은 메타박스 2개를 추가하는 매우 부적절한 방법입니까?동작은 하지만 코드/php가 비효율적일 수 있습니다.원본은 https://typerocket.com에 게시되었습니다.
// Add form and basic text field
function press_meta_box(WP_Post $post) {
add_meta_box('press_meta', 'Press Release Date', function() use ($post) {
$field_name = 'press_date';
$field_name2 = 'press_link';
$field_value = get_post_meta($post->ID, $field_name, true);
$field_value2 = get_post_meta($post->ID, $field_name2, true);
wp_nonce_field('study_nonce', 'study_nonce');
?>
<table class="form-table">
<tr>
<th> <label for="<?php echo $field_name; ?>">Press Release Date (MM/DD/YYYY)</label></th>
<td>
<input id="<?php echo $field_name; ?>"
name="<?php echo $field_name; ?>"
type="text"
value="<?php echo esc_attr($field_value); ?>" />
</td>
</tr>
<tr>
<th> <label for="<?php echo $field_name2; ?>">Full link to pdf</label></th>
<td>
<input id="<?php echo $field_name2; ?>"
name="<?php echo $field_name2; ?>"
type="text"
value="<?php echo esc_attr($field_value2); ?>" />
</td>
</tr>
</table>
<?php
});
}
// Check for empty string allowing for a value of `0`
function empty_str( $str ) {
return ! isset( $str ) || $str === "";
}
// Save and delete meta but not when restoring a revision
add_action('save_post', function($post_id){
$post = get_post($post_id);
$is_revision = wp_is_post_revision($post_id);
$field_name = 'press_date';
$field_name2 = 'press_link';
// Do not save meta for a revision or on autosave
if ( $post->post_type != 'press_release' || $is_revision )
return;
// Do not save meta if fields are not present,
// like during a restore.
if( !isset($_POST[$field_name]) )
return;
// Secure with nonce field check
if( ! check_admin_referer('study_nonce', 'study_nonce') )
return;
// Clean up data
$field_value = trim($_POST[$field_name]);
$field_value2 = trim($_POST[$field_name2]);
// Do the saving and deleting
if( ! empty_str( $field_value ) ) {
update_post_meta($post_id, $field_name, $field_value);
} elseif( empty_str( $field_value ) ) {
delete_post_meta($post_id, $field_name);
}
// Do the saving and deleting 2
if( ! empty_str( $field_value2 ) ) {
update_post_meta($post_id, $field_name2, $field_value2);
} elseif( empty_str( $field_value2 ) ) {
delete_post_meta($post_id, $field_name2);
}
});
언급URL : https://stackoverflow.com/questions/13903529/adding-multiple-meta-boxes-to-a-custom-post-type-in-wordpress
'programing' 카테고리의 다른 글
렌더링에서 아무것도 반환되지 않았습니다.이는 보통 반환문이 누락되었음을 의미합니다.또는 아무것도 렌더링하지 않으려면 null을 반환하십시오. (0) | 2023.03.11 |
---|---|
Wordpress를 CMS로 사용하는 Symfony 2 응용 프로그램 (0) | 2023.03.11 |
플러그인이 활성화 중에 예기치 않은 출력의 X자를 생성했습니다(WordPress). (0) | 2023.03.11 |
AngularJS의 지시적 스코프에서 '@'와 '='의 차이점은 무엇입니까? (0) | 2023.03.11 |
외부 부품 개발 시 리액트 2부 로드 오류를 방지하려면 어떻게 해야 합니까? (0) | 2023.03.11 |