如何从前端保存带有元变量的自定义帖子类型

时间:2017-02-09 14:05:13

标签: wordpress custom-post-type meta-boxes

我在fav_songs注册了一个名为functions.php的{​​{1}}。它定义了三个元框 - 艺术家,流派和发行年份。我可以从管理界面保存数据。现在我想从前端做类似的事情。

为此,我首先创建了以下模板文件:

<?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_post添加了save_song行动。

add_action('save_post', 'save_song');

然后我在管理员中添加了page并使用了上面的模板文件。当页面呈现时,所有字段都会出现。但是当我点击submit时,wp_postswp_postmeta中没有任何内容被保存。目前我只想在title表中存储descriptionwp_posts,在artist表中存储元数据wp_postmeta

我的上述方法肯定出了问题,但我不知道是什么!我最近开始学习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>

即使将操作设置为特定页面,为什么我会跳回主页而不保存任何数据?

1 个答案:

答案 0 :(得分:2)

所有表单元素应始终以独特的为前缀,以防止冲突。在您的表单中,我们将常用前缀&#39; post _&#39;它正在发挥作用:

尝试以下代码:

在同一页面上,您可以获取表单字段并插入db:

您可以进一步使用生成的帖子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' ); ?>