2013-01-03 129 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在我目前的設置中添加了一個可行的解決方案。你會建議你的解決方案來保存評級將在服務器上更輕? –

相關問題