2013-01-03 60 views
2

我在我的平台上添加了一个内容评级系统,作者可以选择他们的帖子适合哪些受众。目前,这些选项可供选择:显示自定义字段选择-WordPress

  • 未评级
  • 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 

现在,问题是,我添加了哪些代码single.php来显示他们的选择?举例来说,如果作者选择了PG,那么我想要echo 'Content Rating: PG';或者如果它是默认的(未评级),我想要echo 'Content Rating: Unrated';。这怎么可能?理想情况下,由于我的平台流量很大,所以服务器上的解决方案很轻。

回答

1

您已经使用delete_post_meta()update_post_meta()函数来删除和修改自定义值。只需使用get_post_meta()函数获取当前帖子的值,并在您认为合适的时候将其回显。

如果您在The Loop的时候,它会是这样的:

$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"; 
} 
+0

请你详细说明我将如何根据我想要的回应它。例如,如果作者选择了PG,那么我想'回声'内容评级:PG';'或者如果它是默认的(未评级),我想'回声'内容评级:未评级';' –

+0

我'我用一个例子更新了我的答案。 –

+1

我刚刚测试了你的编辑,它将所有内容回应为“内容评级:未评级”。你有沙箱来自己测试吗? –

1

它看起来好像将密钥保存到自定义字段而不是其值。如果你计划重新声明你的$ ratings数组,或者(上帝禁止)在全球范围内使用它,我想这样会没事的。但是,如果您保存了实际的评级而不是其ID号码,那么这可能是最好的。

因此改变这一行:

foreach ($ratings as $id => $text) { 
    echo '<option value="' . $id . '"' . (($value == $id) ? ' selected="selected"' : '') . '">' . $text. '</option>'; 
} 

要这样:

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>'; 
} 

在帖子内设置的值后,您可以在single.php中添加此:

if(have_posts()) : while(have_posts()) : the_post(); 
    echo 'Content Rating: '.get_post_meta($post->ID, 'rating', true); 
endwhile;endif; 

更新:

正如我在评论中提到的,我个人尽量避免使用全局变量,并尽可能地重新声明事物。因此,如果您希望仍然通过Key来引用您的评分,则可以通过添加几个简单函数来避开全局变量并重新声明您的评分阵列:

函数。PHP

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'; 
} 

的single.php

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; 

这样一来,如果你需要添加更多的评级类型,你只需要改变gw_get_ratings_array功能而不是搜索的每个声明阵列本身。

+0

帮我理解你的解决方案。进行这些更改,是否意味着每个帖子都需要更新,或者是以前发布的帖子评分是否完好? –

+0

您将不得不手动更新所有帖子,或者在数据库中运行一些SQL查询以将它们从整数转换为字符串。 – maiorano84

+0

Jonah Bishop在我目前的设置中添加了一个可行的解决方案。你会建议你的解决方案来保存评级将在服务器上更轻? –

相关问题