在WordPress的下拉列表中保存字段

时间:2012-06-10 作者:Rob Myrick

下面是成功显示我的Wordpress主题中页面模板下拉菜单的代码。我在自定义帖子类型中使用此菜单,不太明白如何标记它,以便在用户“更新”后保存所选的值。

事实上,该值保存到数据库并正确显示到表中,只是在更新后没有维护所选的值。

我已经看到了其他一些例子,但我的下拉列表是基于一行中的PHP函数。如有任何建议,将不胜感激。

<label class="screen-reader-text" for="page_template"><?php _e(\'Page Template\') ?></label>

<select name="page_template" id="page_template">

<option value=\'page_template\'><?php _e(\'Default Template\'); ?></option>
<?php page_template_dropdown($template); ?>
</select>
以下是更新后的回调函数,它应该显示下拉列表:

 // The Callback for Page Template Assignmets Metabox 
function pagetemplate() { 
global $post; 
// Noncename needed to verify where the data originated 
echo \'<input type="hidden" name="pagetemplatemeta_noncename" id="pagetemplate_noncename" value="\' . 
wp_create_nonce( plugin_basename(__FILE__) ) . \'" />\'; 
// Get the title data if its already been entered 
?>
<label class="screen-reader-text" for="page_template"><?php _e(\'Page Template\') ?></label> 
<select name="page_template" id="page_template"> 
<option value=\'default\'><?php _e(\'Default Template\'); ?></option> 
<?php template_dropdown($template); ?> 
</select> 

<?php

} 


//Creates the page template dropdown menu display and functionality
function template_dropdown( $default = \'\' ) { 
$templates = get_page_templates(); 
ksort( $templates ); 
foreach (array_keys( $templates ) as $template ) 
    : if ( $default == $templates[$template] ) 
        $selected = " selected=\'selected\'"; 
    else 
        $selected = \'\'; 
echo "\\n\\t<option value=\'".$templates[$template]."\' $selected>$template</option>"; 
endforeach; 
} 

2 个回复
SO网友:icc97

这是来自WordPress core code - 第580行:

<label class="screen-reader-text" for="page_template"><?php _e(\'Page Template\') ?></label>
<select name="page_template" id="page_template">
    <option value=\'default\'><?php _e(\'Default Template\'); ?></option>
    <?php page_template_dropdown($template); ?>
</select>
与您的代码唯一不同的是<option value=\'default\'>. 所以我认为你的代码不是问题所在。

还有code for page_template_dropdown 并不复杂:

function page_template_dropdown( $default = \'\' ) {
    $templates = get_page_templates();
    ksort( $templates );
    foreach (array_keys( $templates ) as $template )
        : if ( $default == $templates[$template] )
            $selected = " selected=\'selected\'";
        else
            $selected = \'\';
    echo "\\n\\t<option value=\'".$templates[$template]."\' $selected>$template</option>";
    endforeach;
}
所以我猜你的$template 变量

SO网友:Stephen Harris

代码,它似乎工作得很好。您最初使用:

   page_template_dropdown($template);
这是完全正确的。但是$template 应该包含当前帖子的模板。但你却没有做到这一点。在下拉列表上方的核心代码中,它们具有:

   $template = !empty($post->page_template) ? $post->page_template : false;
这就是为什么。如何检索当前帖子的模板将取决于存储它的方式。

此外,我会使用page_template_dropdown 而不是您自己定义但相同的函数template_dropdown (减少代码重复:))

旁注:

在metabox回调中,pagetemplate, 您可以:

function pagetemplate(){
   global $post;
    ....
}
最好使用以下事实:$post 对象作为参数传递:

function pagetemplate( $post ){
    ....
}

结束

相关推荐

自定义POST类型导致php版本5.2.17中的php错误

我在运行php版本5.2.17的服务器上发现一个php错误,该版本不支持匿名函数。我以前从未听说过这一点(对php来说真的很陌生),但我发现只有php 5.3。x支持以下代码: add_action(\'init\', function() use($name, $args) { 有没有办法解决这个问题?它在5.3.10版上运行良好,但我不得不使用一个不使用php 5.3的旧主机。。。这是创建自定义帖子的完整代码:/* Add Post Type */ function add_po