Cum afișez conținut specific pentru un utilizator?
Am un site care afișează conținutul doar pentru utilizatorii înregistrați. Majoritatea conținutului este disponibil tuturor utilizatorilor, dar o parte din el este specifică fiecărui utilizator (adică toți utilizatorii au acea pagină, dar fiecare vede propriul conținut pe care nimeni altcineva nu îl poate vedea). Ai vreo idee despre cum pot restricționa (și afișa) conținut specific pentru fiecare utilizator?

Ascultă, am codat ceva de genul acum ceva timp și îmi amintesc că voiam să îl încarc în repository-ul de plugin-uri, dar nu am avut timp. Practic, adaugă o casetă meta în ecranul de editare al postărilor sau paginilor și permite utilizatorului să selecteze anumiți utilizatori după nume sau roluri, apoi verifică folosind filtrul the_content
. Deci, iată-l:
Actualizare:
Tocmai a fost aprobat în repository-ul de plugin-uri WordPress, așa că îl puteți descărca Conținut specific utilizatorului de acolo sau din panoul de control și am scris puțin despre el aici.
<?php
/*
Plugin Name: Conținut Specific Utilizatorului
Plugin URI: http://en.bainternet.info
Description: Acest plugin vă permite să selectați anumiți utilizatori după nume sau roluri care pot vizualiza conținutul unei anumite postări sau pagini.
Version: 0.1
Author: Bainternet
Author URI: http://en.bainternet.info
*/
/* Definirea căsuței personalizate */
add_action('add_meta_boxes', 'User_specific_content_box');
/* Adaugă o casetă în coloana principală pe ecranul de editare al tipurilor de postări personalizate */
function User_specific_content_box() {
add_meta_box('User_specific_content', __( 'Caseta de conținut specific utilizatorului'),'User_specific_content_box_inner','post');
add_meta_box('User_specific_content', __( 'Caseta de conținut specific utilizatorului'),'User_specific_content_box_inner','post');
}
/* Afișează conținutul căsuței */
function User_specific_content_box_inner() {
global $post,$wp_roles;
$savedroles = get_post_meta($post->ID, 'U_S_C_roles',true);
//var_dump($savedroles);
$savedusers = get_post_meta($post->ID, 'U_S_C_users',true);
//var_dump($savedusers);
// Folosește nonce pentru verificare
wp_nonce_field( plugin_basename(__FILE__), 'User_specific_content_box_inner' );
echo __('Selectați utilizatorii cărora să li se afișeze acest conținut');
echo '<h4>'.__('După Rol:').'</h4>';
if ( !isset( $wp_roles ) )
$wp_roles = new WP_Roles();
foreach ( $wp_roles->role_names as $role => $name ) {
echo '<input type="checkbox" name="U_S_C_roles[]" value="'.$name.'"';
if (in_array($name,$savedroles)){
echo ' checked';
}
echo '>'.$name.' ';
}
echo '<h4>'.__('După Nume de Utilizator:').'</h4>';
$blogusers = get_users('blog_id=1&orderby=nicename');
$usercount = 0;
foreach ($blogusers as $user) {
echo '<input type="checkbox" name="U_S_C_users[]" value="'.$user->ID.'"';
if (in_array($user->ID,$savedusers)){
echo ' checked';
}
echo '>'.$user->display_name.' ';
$usercount = $usercount + 1;
if ($usercount > 5){
echo '<br/>';
$usercount = 0;
}
}
echo '<h4>'.__('Mesaj pentru Conținut Blocat:').'</h4>';
echo '<textarea rows="3" cols="70" name="U_S_C_message" id="U_S_C_message">'.get_post_meta($post->ID, 'U_S_C_message',true).'</textarea><br/>'.__('Acest mesaj va fi afișat oricui nu este pe lista de mai sus.');
}
/* Salvează Meta Casetă */
add_action('save_post', 'User_specific_content_box_inner_save');
/* Când postarea este salvată, salvează datele noastre personalizate */
function User_specific_content_box_inner_save( $post_id ) {
global $post;
// verifică dacă acest lucru vine de la ecranul nostru și cu autorizația potrivită,
// deoarece save_post poate fi declanșat în alte momente
if ( !wp_verify_nonce( $_POST['User_specific_content_box_inner'], plugin_basename(__FILE__) ) )
return $post_id;
// verifică dacă aceasta este o rutină de salvare automată.
// Dacă este, formularul nostru nu a fost trimis, așa că nu vrem să facem nimic
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// OK, suntem autentificați: trebuie să găsim și să salvăm datele
$savedroles = get_post_meta($post_id, 'U_S_C_roles',true);
$savedusers = get_post_meta($post_id, 'U_S_C_users',true);
if (isset($_POST['U_S_C_roles']) && !empty($_POST['U_S_C_roles'] )){
foreach ($_POST['U_S_C_roles'] as $role){
$new_roles[] = $role;
}
update_post_meta($post_id, 'U_S_C_roles', $new_roles);
}else{
if (count($savedroles) > 0){
delete_post_meta($post_id, 'U_S_C_roles');
}
}
if (isset($_POST['U_S_C_users']) && !empty($_POST['U_S_C_users'])){
foreach ($_POST['U_S_C_users'] as $u){
$new_users[] = $u;
}
update_post_meta($post_id, 'U_S_C_users', $new_users);
}else{
if (count($savedusers) > 0){
delete_post_meta($post_id, 'U_S_C_users');
}
}
if (isset($_POST['U_S_C_message'])){
update_post_meta($post_id,'U_S_C_message', $_POST['U_S_C_message']);
}
}
add_filter('the_content','User_specific_content_filter');
function User_specific_content_filter($content){
global $post,$current_user;
$savedroles = get_post_meta($post->ID, 'U_S_C_roles',true);
$run_check = 0;
$savedusers = get_post_meta($post->ID, 'U_S_C_users',true);
if (!count($savedusers) > 0 && !count($savedroles) > 0 )
return $content;
if (isset($savedroles) && !empty($savedroles)){
foreach ($savedroles as $role){
if (current_user_can($role)) {
return $content;
exit;
}
}
// verificare rol eșuată
$run_check = 1;
}
if (isset($savedusers) && !empty($savedusers)){
get_currentuserinfo();
if (in_array($current_user->ID,$savedusers)){
return $content;
}
// ambele verificări eșuate
return get_post_meta($post->ID, 'U_S_C_message',true);
}
return $content;
}
?>

Presupunând că acest conținut este bucla obișnuită de postări:
$current_user = wp_get_current_user();
if(get_the_author_meta('ID') === $current_user->ID):
// afișează conținutul
endif;
Cred că acest lucru funcționează doar în interiorul buclei.
Dacă ai nevoie de el în afara buclei, atunci poți interoga postările direct din $current_user->ID
:
$query = new WP_Query('author' => $current_user->ID);

singura problemă aici este că nu este foarte intuitiv pentru proprietarul site-ului să seteze 'permisiuni' pe articol

atunci verifică plugin-ul "Members": http://justintadlock.com/archives/2009/09/17/members-wordpress-plugin este mult mai prietenos cu utilizatorul...

mă gândeam la acesta, doar că am văzut că nu a fost actualizat de ceva timp. ai vreo idee dacă încă funcționează?

În plus față de ceea ce a scris One Trick Pony, dacă proprietarul site-ului are nevoie de posibilitatea de a restricționa conținutul pentru fiecare utilizator, poți dezvolta o mică cutie meta personalizată care va apărea în interiorul fiecărui articol și va afișa căsuțe de bifat cu utilizatorii site-ului. Apoi vei avea în baza de date metadatele postului (post_meta) necesare pentru utilizatorii care au permisiunea de a accesa conținutul și poți face condiția.
Dacă ai nevoie de o altă metodă de control al conținutului, este mai bine să oferi câteva detalii mai specifice despre cum ar trebui și este necesar să fie gestionat acest lucru, astfel încât va fi mai ușor să găsești soluții adecvate...
Succes :)

Prima abordare:
- O metodă de a face acest lucru este să creezi o pagină individuală pentru fiecare student și să faci această pagină protejată prin parolă. Acea parolă poate fi dată studentului.
- Poți permite comentarii pentru acea Pagină/Postare, astfel încât studentul să-și poată adăuga întrebările și răspunsurile.
A doua abordare:
- Poți folosi WP Private Content Plus (https://wordpress.org/plugins/wp-private-content-plus/) și să faci fiecare pagină/postare vizibilă doar pentru anumiți utilizatori.
- Poți crea orice tip de meniu pentru utilizatori sau administratori.
Poți folosi și a doua abordare împreună cu prima pentru o securitate suplimentară, deși este opțional.
