如何从前端保存带有元数据框的自定义 post 类型
How can I save a custom post type with metaboxes from front end
我在functions.php
中注册了一个名为fav_songs
的custom post type
。它定义了三个元数据框——艺术家、流派和发行年份。我能够从管理界面保存数据。现在我想从前端做类似的事情。
为此,我首先创建了以下模板文件:
<?php
/* Template Name: Song Entry Form */
get_header();
?>
<form id="song-entry" name="song-entry" method="post" action="">
<p>
<label>Title</label><br />
<input type="text" id="song_title" name="song_title" />
</p>
<p>
<label>Description</label><br />
<input type="text" id="song_desc" name="song_desc" />
</p>
<p>
<label>Artist</label><br />
<input type="text" id="song_artist" name="song_artist" />
<input type="hidden" name="post_type" id="post_type" value="post" />
<input type="hidden" name="action" value="post" />
</p>
<p>
<input type="submit" value="Submit" />
</p>
<?php wp_nonce_field( 'new_song_nonce' ); ?>
</form>
<?php
function save_song()
{
if ('POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['action'])) {
if (!isset($_POST['new_song_nonce'])) {
return;
}
if (!isset($_POST['song_title'])) {
return;
}
if (!isset($_POST['song_desc'])) {
return;
}
$post = array(
'post_title' => $_POST['song_title'],
'post_content' => $_POST['song_desc'],
'post_type' => 'fav_songs'
);
wp_insert_post($post);
update_post_meta($post->ID, '_song_artist_name', $_POST['song_artist']);
}
}
?>
<?php
get_footer();
?>
在我的 functions.php
中,我为 save_song
设置了 save_post
操作。
add_action('save_post', 'save_song');
然后我在admin中添加了一个page
并使用了上面的模板文件。当页面呈现时,所有字段都出现了。但是当我点击 submit
时,wp_posts
和 wp_postmeta
中什么也没有保存。现在我只想将 title
和 description
存储在 wp_posts
table 中,将元数据 artist
存储在 wp_postmeta
table 中。
我上面的方法肯定出了问题,但我不知道是什么!我最近开始学习 WordPress,并没有太多的知识来解决这个问题。请帮忙!
更新(修改模板页面代码)
<?php
/* Template Name: Song Entry Form */
get_header();
if($_POST['post_submit'] == 'Submit') {
$args = array(
'post_title' => $_POST['post_title'],
'post_content' => $_POST['post_desc'],
'post_type' => 'fav_songs',
'post_status' => 'publish',
'comment_status' => 'closed',
'ping_status' => 'closed'
);
$pid = wp_insert_post($args);
add_post_meta($pid, "_song_artist", $_POST['post_artist']);
}
?>
<form id="post_entry" name="post_entry" method="post" action="<?php echo get_page_link('354') ?>">
<p>
<label>Title</label><br />
<input type="text" id="post_title" name="post_title" />
</p>
<p>
<label>Description</label><br />
<input type="text" id="post_desc" name="post_desc" />
</p>
<p>
<label>Artist</label><br />
<input type="text" id="post_artist" name="post_artist" />
<input type="hidden" name="post_type" id="post_type" value="fav_songs" />
<input type="hidden" id="post_action" name="post_action" value="post" />
</p>
<p>
<input type="submit" name="post_submit" value="Submit" />
</p>
<?php wp_nonce_field( 'new_song_nonce' ); ?>
</form>
<?php
get_footer();
?>
我检查了View Source
。表单现在呈现为:
<form id="post-entry" name="post-entry" method="post" action="http://local.tourplanner.com/add-song/">...</form>
即使将操作设置为特定页面,为什么我在不保存任何数据的情况下跳回主页?
所有形式的 元素都应始终以独特的东西作为前缀 以防止冲突。在您的表单中,我们放置了通用前缀 'post_' 并且它正在工作:
试试下面的代码:
在同一页面上,您可以获得表单字段并插入到数据库中:
您可以进一步使用生成的 post id 来保存自定义元数据。
if($_POST['post_submit']=='Submit'){
;
$id = wp_insert_post(array('post_title'=>$_POST['post_title'], 'post_type'=>'fav_songs', 'post_content'=>$_POST['post_desc'],'post_status' => 'publish','comment_status' => 'closed','ping_status' => 'closed'));
}
<form id="song-entry" name="post_entry" method="post" action="<?php echo get_page_link('your template id') ?>">
<p>
<label>Title</label><br />
<input type="text" id="post_title" name="post_title" />
</p>
<p>
<label>Description</label><br />
<input type="text" id="post_desc" name="post_desc" />
</p>
<p>
<label>Artist</label><br />
<input type="text" id="post_artist" name="post_artist" />
<input type="hidden" name="post_type" id="post_type" value="post_type" />
<input type="hidden" name="post_action" id="post_action" value="post_action" />
</p>
<p>
<input type="submit" name="post_submit" value="Submit" />
</p>
<?php wp_nonce_field( 'new_song_nonce' ); ?>
我在functions.php
中注册了一个名为fav_songs
的custom post type
。它定义了三个元数据框——艺术家、流派和发行年份。我能够从管理界面保存数据。现在我想从前端做类似的事情。
为此,我首先创建了以下模板文件:
<?php
/* Template Name: Song Entry Form */
get_header();
?>
<form id="song-entry" name="song-entry" method="post" action="">
<p>
<label>Title</label><br />
<input type="text" id="song_title" name="song_title" />
</p>
<p>
<label>Description</label><br />
<input type="text" id="song_desc" name="song_desc" />
</p>
<p>
<label>Artist</label><br />
<input type="text" id="song_artist" name="song_artist" />
<input type="hidden" name="post_type" id="post_type" value="post" />
<input type="hidden" name="action" value="post" />
</p>
<p>
<input type="submit" value="Submit" />
</p>
<?php wp_nonce_field( 'new_song_nonce' ); ?>
</form>
<?php
function save_song()
{
if ('POST' == $_SERVER['REQUEST_METHOD'] && !empty($_POST['action'])) {
if (!isset($_POST['new_song_nonce'])) {
return;
}
if (!isset($_POST['song_title'])) {
return;
}
if (!isset($_POST['song_desc'])) {
return;
}
$post = array(
'post_title' => $_POST['song_title'],
'post_content' => $_POST['song_desc'],
'post_type' => 'fav_songs'
);
wp_insert_post($post);
update_post_meta($post->ID, '_song_artist_name', $_POST['song_artist']);
}
}
?>
<?php
get_footer();
?>
在我的 functions.php
中,我为 save_song
设置了 save_post
操作。
add_action('save_post', 'save_song');
然后我在admin中添加了一个page
并使用了上面的模板文件。当页面呈现时,所有字段都出现了。但是当我点击 submit
时,wp_posts
和 wp_postmeta
中什么也没有保存。现在我只想将 title
和 description
存储在 wp_posts
table 中,将元数据 artist
存储在 wp_postmeta
table 中。
我上面的方法肯定出了问题,但我不知道是什么!我最近开始学习 WordPress,并没有太多的知识来解决这个问题。请帮忙!
更新(修改模板页面代码)
<?php
/* Template Name: Song Entry Form */
get_header();
if($_POST['post_submit'] == 'Submit') {
$args = array(
'post_title' => $_POST['post_title'],
'post_content' => $_POST['post_desc'],
'post_type' => 'fav_songs',
'post_status' => 'publish',
'comment_status' => 'closed',
'ping_status' => 'closed'
);
$pid = wp_insert_post($args);
add_post_meta($pid, "_song_artist", $_POST['post_artist']);
}
?>
<form id="post_entry" name="post_entry" method="post" action="<?php echo get_page_link('354') ?>">
<p>
<label>Title</label><br />
<input type="text" id="post_title" name="post_title" />
</p>
<p>
<label>Description</label><br />
<input type="text" id="post_desc" name="post_desc" />
</p>
<p>
<label>Artist</label><br />
<input type="text" id="post_artist" name="post_artist" />
<input type="hidden" name="post_type" id="post_type" value="fav_songs" />
<input type="hidden" id="post_action" name="post_action" value="post" />
</p>
<p>
<input type="submit" name="post_submit" value="Submit" />
</p>
<?php wp_nonce_field( 'new_song_nonce' ); ?>
</form>
<?php
get_footer();
?>
我检查了View Source
。表单现在呈现为:
<form id="post-entry" name="post-entry" method="post" action="http://local.tourplanner.com/add-song/">...</form>
即使将操作设置为特定页面,为什么我在不保存任何数据的情况下跳回主页?
所有形式的 元素都应始终以独特的东西作为前缀 以防止冲突。在您的表单中,我们放置了通用前缀 'post_' 并且它正在工作:
试试下面的代码:
在同一页面上,您可以获得表单字段并插入到数据库中:
您可以进一步使用生成的 post id 来保存自定义元数据。
if($_POST['post_submit']=='Submit'){
;
$id = wp_insert_post(array('post_title'=>$_POST['post_title'], 'post_type'=>'fav_songs', 'post_content'=>$_POST['post_desc'],'post_status' => 'publish','comment_status' => 'closed','ping_status' => 'closed'));
}
<form id="song-entry" name="post_entry" method="post" action="<?php echo get_page_link('your template id') ?>">
<p>
<label>Title</label><br />
<input type="text" id="post_title" name="post_title" />
</p>
<p>
<label>Description</label><br />
<input type="text" id="post_desc" name="post_desc" />
</p>
<p>
<label>Artist</label><br />
<input type="text" id="post_artist" name="post_artist" />
<input type="hidden" name="post_type" id="post_type" value="post_type" />
<input type="hidden" name="post_action" id="post_action" value="post_action" />
</p>
<p>
<input type="submit" name="post_submit" value="Submit" />
</p>
<?php wp_nonce_field( 'new_song_nonce' ); ?>