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

问题描述 投票:0回答:1

我在

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

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

<?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_posts
wp_postmeta
中没有保存任何内容。现在我只想将
title
description
存储在
wp_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>

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

wordpress custom-post-type meta-boxes
1个回答
3
投票

所有表单元素应始终以独特的作为前缀,以防止冲突。在您的表单中,我们添加了通用前缀“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' ); ?>

© www.soinside.com 2019 - 2024. All rights reserved.