在前端显示自定义字段评级系统

时间:2013-01-03 作者:Christine Cooper

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

未评级

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\';. 这怎么可能?理想情况下,在我的平台流量很大的情况下,服务器上的解决方案是轻量级的。

3 个回复
SO网友:s_ha_dum

你已经在做你需要做的事情了,但是在另一个环境中。

$value = get_post_meta($post->ID, \'rating\', true);
获取该值并格式化以供显示。

Edit: 我安装了你的整个代码块。您存储的是您的密钥,而不是您的评级值。你需要访问它$ratings 再次数组以提取值。

$ratings = array(
    1 => \' G \',
    2 => \' PG \',
    3 => \' R \',
);

if (!empty($ratings[$value])) {
  echo \'<p>Content Rating : \'.$ratings[$value].\'</p>\';
} else {
  echo \'<p>Content Rating : Unrated</p>\';
}
然而,甚至在我发现问题之前,我就看到了内容回声。“内容分级:1”,而不是“内容分级:G”。我不知道你为什么声称什么也没看到。如果您仍然没有看到任何内容,则说明有问题,但此代码没有问题。

我没有更改您的原始代码块。

SO网友:brasofilo

检查元数据(var_dump 或者FireHP),我们可以看到meta存储为associative array 带一对$key=>$value.

关键是0 以及所选评级的值和编号<例如:array(\'0\'=>\'1\') 对于G.

因此,这个小函数返回正确的评级:

function wpse_78113_get_rating( $pid )
{
    $ratings = array(
        1 => \' G \',
        2 => \' PG \',
        3 => \' R \',
    );
    $meta = get_post_meta( $pid, \'rating\' );
        // var_dump($meta);

    if( empty($meta) || empty($meta[0]) )
        return \'Content rating: Unrated\';

    return \'Content rating: \' . $ratings[$meta[0]];
}
并像这样使用它:echo wpse_78113_get_rating( $post->ID );

SO网友:Peter Willis III

if ( is_null($_REQUEST["rating"]) ) {
    delete_post_meta($postid, \'rating\');
} else {
    update_post_meta($postid, \'rating\', $_REQUEST[\'rating\']);
}
在save\\u元函数中,这是否不需要是$post->ID?

结束