Creer une meta box pour rendre des posts privés

Creer une meta box pour rendre des posts privés

Sur le modèle de  Pippin Williamson on va créer un plugin pour à la fois créer des shortcodes pour rendre une partie d’un post privé, mais aussi pour donner la possibilité au client, sur la page d’édition , de définir le niveau d’accessibilité du post ou de la page.

Création du shortcode

<?php
/*
Plugin Name: Contenu Privé
Plugin URI: http://copier-coller.com
Description: Du contenu privé
Version: 1.0
Author: Copier-coller
Author URL: http://copier-coller.com
*/

?>
function restrict_shortcode( $atts, $content = null ) {
extract( shortcode_atts( array( 'userlevel' => 'none', ), $atts ) );
if ($userlevel == 'admin' && current_user_can('switch_themes')) {
return do_shortcode($content); }
if ($userlevel == 'editor' && current_user_can('moderate_comments')) {
return do_shortcode($content); }
if ($userlevel == 'author' && current_user_can('upload_files')) {
return do_shortcode($content); }
if ($userlevel == 'subscriber' && current_user_can('read')) {
return do_shortcode($content); }
if ($userlevel == 'none' && is_user_logged_in) {
return do_shortcode($content); }
else return '<span style="color: red;">Le contenu est visible uniquement par les ' . $userlevel . 's</span>'; }
add_shortcode('restrict', 'restrict_shortcode');

Cette fonction va nous permettre déjà de privatiser l’article , en utilisant le shortcode suivant,
[restrict userlevel= »editor »] . . . Cet article est réservé aux utilisateurs ayant un niveau d’éditeurs uniquement . . . [/restrict]

Cela nous permet donc de restreindre tout ou une partie seulement d’un article à une certaine catégorie d’utilisateurs : admin, éditeur, auteur ou abonné.

On va ensuite étendre la fonctionnalité de notre plugin en reliant cette fonction à une metabox, afin que l’utilisateur aie la possibilité de définir à l’avance si un article ou une page sera visible de tous ou non.

Création de la métabox

//custom meta boxes
$prefix = 'rc';

$meta_box = array(
'id' => 'rcMetaBox',
'title' => 'Rendre ce contenu privé',
'context' => 'normal',
'priority' => 'high',
'fields' => array(
array(
'name' => 'User Level',
'id' => $prefix . 'UserLevel',
'type' => 'select',
'desc' => 'Choisissez qui peut consulter cette page / article',
'options' => array('None', 'Administrator', 'Editor', 'Author', 'Subscriber'),
'std' => 'None'
),
array(
'name' => 'Extraire du RSS?',
'id' => $prefix . 'FeedHide',
'type' => 'checkbox',
'desc' => 'Cacher l'extrait de cette page ou artile pour le RSS?',
'std' => ''
)
)
);
// Ajout de la box
function rcAddMetaBoxes() {
global $meta_box;
foreach (array('post','page') as $type)
add_meta_box($meta_box['id'], $meta_box['title'], 'rcShowMetaBox', $type, $meta_box['context'], $meta_box['priority']);
}
add_action('admin_menu', 'rcAddMetaBoxes');

Voici la suite de la fonction pour afficher notre metabox.

function rcShowMetaBox() {
global $meta_box, $post;

// on utilise un nonce pour la verif
echo '<input type="hidden" name="rcMetaNonce" value="', wp_create_nonce(basename(__FILE__)), '" />';

echo '<table>';

foreach ($meta_box['fields'] as $field) {
// get current post meta data
$meta = get_post_meta($post->ID, $field['id'], true);

echo '<tr>',
'<th style="width:20%"><label for="', $field['id'], '">', $field['name'], '</label></th>',
'<td>';
switch ($field['type']) {
case 'select':
echo '<select name="', $field['id'], '" id="', $field['id'], '">';
foreach ($field['options'] as $option) {
echo '<option', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>';
}
echo '</select>';
break;
case 'checkbox':
echo '<input type="checkbox" name="', $field['id'], '" id="', $field['id'], '"', $meta ? ' checked="checked"' : '', ' />';
break;
}
echo '<td>', $field['desc'], '</td><td>',
'</tr>';
}

echo '</table>';
}

Cela nous ressort notre meta box dans l’éditeur, et on ajoute un nonce de vérification pour sécuriser la saisie.

Enfin la fonction d’enregistrement de notre metabox

function rcSaveData($post_id) { 
global $meta_box; // verifie le nonce
if (!wp_verify_nonce($_POST['rcMetaNonce'], basename(__FILE__)))
{ return $post_id; } // vérifie l' autosave
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id; } // vérifie les permissions
if ('page' == $_POST['post_type']) {
if (!current_user_can('edit_page', $post_id)) {
return $post_id; } }
elseif (!current_user_can('edit_post', $post_id))
{ return $post_id; }
foreach ($meta_box['fields'] as $field) {
$old = get_post_meta($post_id, $field['id'], true);
$new = $_POST[$field['id']];
if ($new && $new != $old) {
update_post_meta($post_id, $field['id'], $new); }
elseif ('' == $new && $old) {
delete_post_meta($post_id, $field['id'], $old); } } }
add_action('save_post', 'rcSaveData');

Tester le rôle utilisateur pour privatiser un article

Les fonctions suivantes vont nous permettre à l’affichage de tester le rôle de l’utilisateur pour afficher ou non l’article. La première fonction analyse les données de la metabox, et en fonction du rôle utilisateur inséré, affiche ou non un message d’erreur.

function rcMetaDisplayEditor($error = ' ') 
{
$custom_meta = get_post_custom($post->ID);
$rcUserLevel = $custom_meta['rcUserLevel'][0];
if ($rcUserLevel == 'Administrator')
{
echo 'This content is restricted to ' . $rcUserLevel;
}
else { $error .= ""; return $error;
} }
function rcMetaDisplayAuthor($error = ' ') {
$custom_meta = get_post_custom($post->ID);
$rcUserLevel = $custom_meta['rcUserLevel'][0];
if ($rcUserLevel == 'Administrator' || $rcUserLevel == 'Editor')
{
echo 'This content is restricted to ' . $rcUserLevel;
}
else
{
$error .= ""; return $error;
} }
function rcMetaDisplaySubscriber($error = ' ')
{
$custom_meta = get_post_custom($post->ID);
$rcUserLevel = $custom_meta['rcUserLevel'][0];
if ($rcUserLevel == 'Administrator' || $rcUserLevel == 'Editor' || $rcUserLevel == 'Author')
{
echo 'Ce contenu est reservé aux ' . $rcUserLevel;
}
else { $error .= ""; return $error;
} }
function rcMetaDisplayNone($error = ' ')
{
$custom_meta = get_post_custom($post->ID);
$rcUserLevel = $custom_meta['rcUserLevel'][0];
if (!current_user_can('read') && $rcUserLevel == 'Administrator' || $rcUserLevel == 'Editor'
|| $rcUserLevel == 'Author' || $rcUserLevel == 'Subscriber')
{
echo 'Ce contenu est reservé aux ' . $rcUserLevel;
} else
{
$error .= ""; return $error;
} }

Cette deuxième fonction va, en fonction du rôle utilisateur, afficher le contenu approprié

function checkUser() { 
if (current_user_can('read')) {
if (current_user_can('upload_files')) {
if (current_user_can('moderate_comments')) {
if (current_user_can('switch_themes')) { //do nothing here for admin
} else {
add_filter('the_content', 'rcMetaDisplayEditor');
}
} else {
add_filter('the_content', 'rcMetaDisplayAuthor');
}
} else {
add_filter('the_content', 'rcMetaDisplaySubscriber');
}
} else { add_filter('the_content', 'rcMetaDisplayNone');
}
} add_action('loop_start', 'checkUser');

Enfin une fonction pour cacher l’article ou la page dans le rss.

function rcCheckFeed()
{
add_filter('the_content', 'rcIsFeed');
}
add_action('rss_head', 'rcCheckFeed');
function rcIsFeed($error = ' ')
{
$custom_meta = get_post_custom($post->ID);
$rcUserLevel = $custom_meta['rcUserLevel'][0];
$rcFeedHide = $custom_meta['rcFeedHide'][0];
if (is_feed && $rcFeedHide == 'on')
{
echo 'Ce contenu est reservé aux ' . $rcUserLevel . 's';
}
else
{
$error .= "";
return $error;
}

}