将元框中下拉菜单中的选定项保存为自定义帖子类型的元数据值

时间:2013-05-10 作者:Burgon

我已经为此绞尽脑汁好几天了,我的谷歌浏览器让我失望了。

我创建了一个带有下拉菜单的自定义元框,其中列出了自定义分类法中的所有术语。What I cannot figure out is how to save the selected option from the drop down menu when the post is saved. 我对PHP有点陌生,虽然我找到了很多教程和其他问题来讨论如何做到这一点,但当他们谈到保存数据时,我总是感到困惑。

以下是我创建metabox的代码:

<?php
function MC_Catalog_create() {
    add_meta_box( \'MC_Catalog_meta\', \'Course Information\', \'MC_Catalog_course_info\',\'mc_course_post\', \'normal\', \'high\' );
}

function MC_Catalog_course_info( $post ) {

$MC_Catalog_course_area = get_post_meta( $post->ID, \'_MC_Catalog_course_area\', true );
$MC_Catalog_course_num = get_post_meta( $post->ID, \'_MC_Catalog_course_num\', true );
$MC_Catalog_course_name = get_post_meta( $post->ID, \'_MC_Catalog_course_name\', true );
$MC_Catalog_course_desc = get_post_meta( $post->ID, \'_MC_Catalog_course_desc\', true );

?>
<table class="form-table" style="width:auto;">
    <tr>
        <td valign="top">Course Area:</td>
        <td valign="top">
        <select name="MC_Catalog_course_area">
           <?php 
           $myterms = get_terms(\'course_areas\', $args);
                $args = array(\'orderby\'=>\'name\',\'order\'=>\'ASC\',\'hide_empty\'=>false);
            foreach($myterms as $term){
                echo "<option value=\'$term->term_id\'" . selected( $term->term_id, $MC_Catalog_course_area, false) .">" . esc_html( $term->name ) . "</option>";
            }
            ?>
        </select>
        </td>
    </tr>
    <tr>
        <td valign="top">Course Number:</td>
        <td valign="top"><input name="MC_Catalog_course_num" type="text" value="<?php echo esc_attr( $MC_Catalog_course_num ); ?>" size="50" /></td>
    </tr>
    <tr>
        <td valign="top">Course Title:</td>
        <td valign="top"><input type="text" name="MC_Catalog_course_name" value="<?php echo esc_attr( $MC_Catalog_course_name ); ?>" size="50" /></td>
    </tr>
    <tr>
        <td valign="top">Course Description:</td>
        <td valign="top"><textarea name="MC_Catalog_course_desc" rows="8" cols="100"><?php echo esc_attr( $MC_Catalog_course_desc ); ?></textarea></td>
    </tr>
</table>
<?php } ?>
下面是我保存元数据的代码:

//hook to save the meta box data
add_action( \'save_post\', \'MC_Catalog_save_meta\' );

function MC_Catalog_save_meta( $post_id ) {

    //verify the meta data is set
    if ( isset( $_POST[\'MC_Catalog_course_num\'] ) ) {

        //save the meta data
        update_post_meta( $post_id, \'_MC_Catalog_course_area\', strip_tags( $_POST[\'MC_Catalog_course_area\'] ) );
    update_post_meta( $post_id, \'_MC_Catalog_course_num\', strip_tags( $_POST[\'MC_Catalog_course_num\'] ) );
    update_post_meta( $post_id, \'_MC_Catalog_course_name\', strip_tags( $_POST[\'MC_Catalog_course_name\'] ) );
    update_post_meta( $post_id, \'_MC_Catalog_course_desc\', strip_tags( $_POST[\'MC_Catalog_course_desc\'] ) );
    }
}
?>

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

$myterms = get_terms($taxonomies, $args); 返回术语对象数组。使用$term->term_idoption 值…

"<option value=\'$term->term_id\'>". esc_html( $term_name ) . "</option>"
…并存储该ID,而不是名称。名称可以更改,ID将保持不变,除非有人删除一个术语并使用相同的名称创建一个新术语。

要选择正确的选项,请使用selected():

"<option value=\'$term->term_id\'" . selected( $term->term_id, $MC_Catalog_course_area, FALSE ) .">"
您可以使用验证值absint() 然后

你的save_post 处理程序需要more checks.

结束

相关推荐

WordPress主题中的PHP脚本

我有一个php脚本,我想在我的wordpress主题中使用它。我想根据属于特定组的用户限制对该页面的访问,因此,将其保存在wordpress中非常重要。我尝试了至少9个不同的插件,我能找到的最接近的一个插件是将代码包装成一个独特的短代码放在页面上的插件。然而,脚本没有发挥应有的作用。最后,重要的是,我不显示php代码供用户在页面源代码中查看。这能实现吗?如果能,如何实现?非常感谢!