Hey, bin ganz neu hier - habe aber gleich mal etwas mitgebracht :)
Ausgangssituation
Ich brauchte eine Funktion/Plugin, um bestimmte Seiten nur für bestimmte Benutzer sichtbar zu machen. Geplant ist ein Downloadarchiv, wo man Zugänge für bestimmte Nutzer vergeben kann und diese sollten dann nur die für sie bestimmten Seiten sehen. Klingt relativ simpel - war es aber gar nicht.
Ich suchte tagelang nach Plugins oder sonstigen Lösungen und bin auf sehr viele Forenbeiträge gestoßen, wo dies gebraucht wurde. Allerdings überall mit der Antwort - geht nicht. Es gab einen Weg - allerdings viel zu umständlich, dies in Betracht zu ziehen :)
Lösung
Ich habe selbst etwas gebastelt. Ich habe ein Custom Write Panel angelegt wo alle Benutzer mit der Rolle "Abonnent" angezeigt werden - mit Checkbox zum abhaken.
Das wird dann gespeichert und vor der Ausgabe abgefragt, ob man der Benutzer ist. Admins haben immer Zugriff. Schaut es euch mal an - vielleicht hilft es dem ein oder anderen ja! :)
Ich hab das Custom Write Panel nach diesem Tutorial aufgebaut und dann dementsprechend erweitert.
Code für die functions.php
<?php
//////////////////////
// Benutzerverwaltung
//////////////////////
// Einstellungen
$key = "User";
$meta_boxes = array(
"userlist" => array(
"name" => "user")
);
// Erstellen
function create_meta_box() {
global $key;
if( function_exists( 'add_meta_box' ) ) {
add_meta_box( 'new-meta-boxes', ucfirst($key) . ' Visibility', 'display_meta_box', 'post', 'side', 'high' );
}
}
// HTML
function display_meta_box() {
global $post, $meta_boxes, $key;
echo '<div class="form-wrap">';
wp_nonce_field( plugin_basename( __FILE__ ), $key . '_wpnonce', false, true );
foreach($meta_boxes as $meta_box) {
$data = get_post_meta($post->ID, $key, true);
$blogusers = get_users('blog_id=1&orderby=display_name&role=subscriber');
foreach ($blogusers as $user) {
$boxes[] = $user->ID;
echo '<label class="user-options">';
echo '<input type="checkbox" name="'. $meta_box["name"].'[]" id="'.$meta_box["name"].$user->ID.'" value="'.$user->ID.'"';
if ($data[$meta_box['name']] <> "" ) {
if (in_array($user->ID, $data[$meta_box['name']])) {
echo ' checked="checked"';
}
}
echo '/>';
echo ' ' . $user->display_name;
echo '</label>';
}
}
echo '<p>Es werden hier alle Benutzer mit der Rolle <strong>Abonnent</strong> aufgelistet. Administratoren haben immer Zugriff.</p>';
echo '</div>';
}
// Meta Daten speichern
function save_meta_box($post_id) {
global $post, $meta_boxes, $key;
foreach($meta_boxes as $meta_box) {
$data[$meta_box[ 'name' ]] = $_POST[ $meta_box[ 'name' ]];
}
if (!wp_verify_nonce($_POST[ $key . '_wpnonce'], plugin_basename(__FILE__))) {
return $post_id;
}
if (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
update_post_meta($post_id, $key, $data);
}
// Funktionen registrieren
add_action('admin_menu', 'create_meta_box');
add_action('save_post', 'save_meta_box');
?>
Alles anzeigen
Code im Template
<?php
// Prüfen, ob Wert in Array vorhanden - in_array() funktioniert hier nicht
function my_in_array( $needle, $haystack ){
if (is_array($haystack)){
return in_array($needle, $haystack);
}
else {
return false;
}
}
// Prüfen, ob eingeloggt
if ( is_user_logged_in() ) {
while (have_posts()) : the_post();
// Benutzerdaten abrufen
global $current_user;
get_currentuserinfo();
$getaccessuser = get_post_meta( $post->ID, 'User', true );
// Prüfen, ob Benutzer Daten abrufen darf (oder ob man Administrator ist)
if (my_in_array($current_user->ID, $getaccessuser['user']) || current_user_can('administrator')) {
// DEIN INHALT
}
endwhile;
}
// Ansonsten Weiterleitung auf Startseite
else {
wp_redirect(home_url()); exit;
}
?>
Alles anzeigen
Ich bin mir derzeit noch nicht sicher, ob ich daraus vielleicht ein Plugin machen soll. Was meint ihr? Zumindest gibt es dafür noch kein Plugin, was ich ja selbst auch sehr merkwürdig fand :)
mfg
Phil