Php 显示自定义字段选择-Wordpress
我在我的平台上添加了一个内容评级系统,作者可以在其中选择他们的文章适合哪些受众。目前,这些选项可用:Php 显示自定义字段选择-Wordpress,php,wordpress,post,custom-fields,Php,Wordpress,Post,Custom Fields,我在我的平台上添加了一个内容评级系统,作者可以在其中选择他们的文章适合哪些受众。目前,这些选项可用: 未评级 G PG R 我用于在编辑后页面上显示评级选项的代码是: // Article Content Rating add_action( 'add_meta_boxes', 'rating_select_box' ); function rating_select_box() { add_meta_box( 'rating_select_box', // id,
- 未评级
- G
- PG
- R
// Article Content Rating
add_action( 'add_meta_boxes', 'rating_select_box' );
function rating_select_box() {
add_meta_box(
'rating_select_box', // id, used as the html id att
__( 'Content Rating (optional)' ), // meta box title
'rating_select_cb', // callback function, spits out the content
'post', // post type or page. This adds to posts only
'side', // context, where on the screen
'low' // priority, where should this go in the context
);
}
function rating_select_cb( $post ) {
global $wpdb;
$value = get_post_meta($post->ID, 'rating', true);
echo '<div class="misc-pub-section misc-pub-section-last"><span id="timestamp"><label>Article Content Rating: </label>';
$ratings = array(
1 => ' G ',
2 => ' PG ',
3 => ' R ',
);
echo '<select name="rating">';
echo '<option value=""' . ((($value == '') || !isset($ratings[$value])) ? ' selected="selected"' : '') . '> Unrated </option>';
// output each rating as an option
foreach ($ratings as $id => $text) {
echo '<option value="' . $id . '"' . (($value == $id) ? ' selected="selected"' : '') . '">' . $text. '</option>';
}
echo '</select>';
echo '</span></div>';
}
add_action( 'save_post', 'save_metadata');
function save_metadata($postid)
{
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return false;
if ( !current_user_can( 'edit_page', $postid ) ) return false;
if( empty($postid) ) return false;
if ( is_null($_REQUEST["rating"]) ) {
delete_post_meta($postid, 'rating');
} else {
update_post_meta($postid, 'rating', $_REQUEST['rating']);
}
}
// END Article Content Rating
//文章内容分级
添加动作(“添加元框”、“评级选择框”);
功能等级选择框(){
添加元框(
'rating_select_box',//id,用作html id att
__(‘内容分级(可选)’,//元框标题
'rating_select_cb',//回调函数,吐出内容
“post',//post类型或页面。这仅添加到post
'side',//上下文,屏幕上的位置
'low'//优先级,在上下文中应该放在哪里
);
}
功能评级\选择\ cb($post){
全球$wpdb;
$value=get\u post\u meta($post->ID,'rating',true);
回声“文章内容评级:”;
$ratings=数组(
1=>G',
2=>“PG”,
3=>“R”,
);
回声';
回声“未分级”;
//将每个额定值作为选项输出
foreach($id=>$text){
echo'您已经使用了delete\u post\u meta()
和update\u post\u meta()
函数来删除和修改自定义值。只需使用该函数获取当前帖子的值,然后根据需要进行回显即可
如果你在,它会是这样的:
$rating = get_post_meta(get_the_ID(), 'rating', TRUE);
编辑:
您已经知道您的ID到评级映射(我可能会将此映射设置为全局数组、某些定义或类似的内容)。只需使用它来查找要输出的字符串:
$ratings = array(
1 => 'G',
2 => 'PG',
3 => 'R'
);
if(array_key_exists($rating, $ratings)) {
echo "Content Rating: $ratings[$rating]";
} else {
echo "Content Rating: Unrated";
}
看起来您保存的是自定义字段的键,而不是它的值。如果您计划重新声明$ratings数组,或者(上帝禁止)全局使用它,我想这是可以的。但是,如果您保存的是实际的评级,而不是它的ID号,这可能是最好的
因此,改变这一行:
foreach ($ratings as $id => $text) {
echo '<option value="' . $id . '"' . (($value == $id) ? ' selected="selected"' : '') . '">' . $text. '</option>';
}
更新:
正如我在评论中提到的,我个人尽量避免使用全局变量并重新说明问题。因此,如果您仍然希望按键引用您的评级,您可以通过添加一些简单的函数绕过全局变量并重新说明您的评级数组:
functions.php
single.php
这样,如果您需要添加更多的分级类型,您只需要更改gw_get_ratings_数组函数,而不需要搜索数组本身的每个声明。您能否详细说明我将如何根据需要对其进行回显。例如,如果作者选择了PG,那么我想回显“内容分级:PG”;
或默认值(未分级),我想echo'Content Rating:Unrated';
我刚刚测试了你的编辑,它以Content Rating:Unrated
的形式回显所有内容。你有沙箱自己测试吗?你的设置中$Rating
的值是多少?我假设它是用户选择的评级ID。这是奇怪的部分,当执行$rating=get_post_meta(get_the_ID(),'rating',TRUE);echo$rating
时,它会正确地回显值编号。但是,您更新的代码没有按照您的建议运行。您自己测试过吗?另一种方法是设置一个简单的函数,而不是使用丑陋的全局变量或重新定义数组(类似于“get_ratings_array”的内容)在functions.php中,返回静态数组。任何时候你需要查询该键,你都可以调用该函数。这取决于你想如何处理它,我只是不喜欢全局和重新声明。帮我理解你的解决方案。进行这些更改,是指每个帖子都需要更新,还是都是以前的帖子完整发布的帖子评级?您必须手动更新所有帖子,或者在数据库中运行一些SQL查询,将它们从整数转换为字符串。Jonah Bishop在我当前的设置中添加了一个可行的解决方案。您是否建议您的保存评级的解决方案在服务器上更轻一些?Jonah的解决方案是perfec非常正确。请查看我的评论,因为我个人的编码实践是尽可能避免全局性和重新说明。但基本上,我们的解决方案在服务器负载方面的差异几乎可以忽略不计。@maiorana84感谢您的评论。如果您有时间,请您演示一下如何添加fu在我使用的代码中执行类似于get\u ratings\u array
的操作?我的编码知识有限,因此我不知道如何按照您的建议进行处理。
echo '<option value="Unrated"' . ((!$value || $value == 'Unrated' ? ' selected="selected"' : '') . '">Unrated</option>';
foreach ($ratings as $id => $text) {
echo '<option value="' .trim($text). '"' . (($value == trim($text)) ? ' selected="selected"' : '') . '">' . $text. '</option>';
}
if(have_posts()) : while(have_posts()) : the_post();
echo 'Content Rating: '.get_post_meta($post->ID, 'rating', true);
endwhile;endif;
function gw_get_ratings_array()
{
$ratings = array(
1 => 'G',
2 => 'PG',
3 => 'R'
);
return $ratings;
}
function gw_get_rating($key=0)
{
$i = (int)$key;
$ratings = gw_get_ratings_array();
return isset($ratings[$i]) && $ratings[$i] ? $ratings[$i] : 'Unrated';
}
if(have_posts()) : while(have_posts()) : the_post();
$rating_id = get_post_meta($post->ID, 'rating', true);
echo 'Content Rating: '.gw_get_rating($rating_id);
endwhile;endif;