我有这个代码将自定义元框speaker
添加到自定义帖子类型event
。
/*
|--------------------------------------------
| Speaker Meta Box in events
|--------------------------------------------
*/
function speaker_box() {
add_meta_box(
'speaker',
__( 'Speaker', 'dbem' ),
'speaker_box_content',
'event',
'side',
'high'
);
}
add_action( 'add_meta_boxes', 'speaker_box' );
/*
|--------------------------------------------
| Speaker meta box content in events
|--------------------------------------------
*/
function speaker_box_content( $post ) {
// generate a nonce field
wp_nonce_field( basename( __FILE__ ), 'dbem-speaker-nonce' );
// get previously saved meta values (if any)
$speaker = get_post_meta( $post->ID, 'speaker', true );
echo '<label for="speaker"></label>';
echo '<select name="speaker" id="speaker">';
echo '<option value="">Select</option>';
foreach (get_speakers() as $key => $value) {
if($speaker == $key) {
echo '<option value="'.$key.'" selected="selected">'.$value.'</option>';
} else {
echo '<option value="'.$key.'">'.$value.'</option>';
}
}
echo '</select>';
}
/*
|--------------------------------------------
| Get all speakers
|--------------------------------------------
*/
function get_speakers() {
$output = array();
$args = array(
'post_type' => 'speaker',
);
$speakers = new WP_Query( $args );
if( $speakers->have_posts() ) {
while( $speakers->have_posts() ) {
$speakers->the_post();
$output[get_the_ID()] = get_the_title();
}
}
return $output;
}
我在永久链接设置中选择了post name
。但是这里不是将事件标题添加到固定链接,而是将speaker
元数据的最后一个下拉项文本和一些数字添加到URL。这有什么不对?我通过评论上面的代码对此进行了测试,问题仅出在此代码中。
保存功能,
function speaker_box_save( $post_id ) {
if ( 'event' != $_POST['post_type'] ) {
return;
}
$speaker = $_POST['speaker'];
if( isset($speaker)) {
update_post_meta( $post_id, 'speaker', $speaker );
}
}
add_action( 'save_post', 'speaker_box_save' );
答案 0 :(得分:2)
不确定如何或为何,但WP_Query
正在影响新创建帖子的帖子。它需要最后speaker
并将其用作添加的新event
的slug。
有人想知道为什么这是WordPress开发人员最常见的Q&amp; A: When should you use WP_Query vs query_posts() vs get_posts()?
使用以下内容可以解决这个奇怪的问题:
function get_speakers() {
$output = array();
$args = array(
'post_type' => 'portfolio',
);
$speakers = get_posts( $args );
if( $speakers ) {
foreach( $speakers as $spk ) {
$output[$spk->ID] = $spk->post_title;
}
}
return $output;
}