2

我在我的平台上添加了一个内容评级系统,作者可以在其中选择他们的帖子适合哪些受众。目前,这些选项可用:

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

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

4

2 回答 2

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";
}
于 2013-01-03T20:37:13.400 回答
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';
}

单.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 函数,而不是搜索数组本身的每个声明。

于 2013-01-03T20:41:41.840 回答