Je crée un plugin photo pour que les utilisateurs puissent voir leurs photos. Le plug-in fonctionne de manière à créer un répertoire dans le dossier uploads à l’intérieur de wp-content
lors de l’ajout d’un nouvel utilisateur. C'est ici que les images de cet utilisateur seront stockées.
Voici le code:
function create_photo_folder() {
$upload = wp_upload_dir();
$upload_dir = $upload['basedir'];
$upload_dir = $upload_dir . '/USER_PHOTOS';
if (! is_dir($upload_dir)) {
mkdir( $upload_dir, 0700 );
}
$blogusers = get_users('blog_id=1&orderby=nicename');
foreach ($blogusers as $user) {
wp_mkdir_p($upload_dir . '/USER_PHOTOS'.$user->user_login);
}
}
register_activation_hook( __FILE__, 'create_photo_folder' );
add_action('user_register','create_photo_folder');
Le code ci-dessus fonctionne bien pour créer les dossiers. Le problème auquel je suis confronté est que je veux pouvoir récupérer le contenu dans le dossier de chaque utilisateur et le lui montrer lorsqu'il se connecte.
J'ai déjà créé une page de menu appelée VOS PHOTOS pour tous les utilisateurs. Maintenant, j'aimerais pouvoir récupérer le contenu de chaque dossier pour chaque utilisateur et le lui afficher.
D'abord une observation, l'utilisation de $upload_dir.'/USER_PHOTOS'.$user->user_login
peut entraîner un désordre des dossiers dans wp-content/
.
Je suggère wp-content/user-photos/user-login/
. Et l'exemple suivant le considère comme suit.
Dans votre cas, vous avez déjà l'élément de menu, par souci de complétude, c'est le sous-menu utilisé pour le développement:
add_action( 'admin_menu', 'wpse_75873_folder_menu' );
function wpse_75873_folder_menu()
{
add_media_page(
'User Photos Media',
'User Photos',
'edit_posts',
'so-13416177',
'wpse_75873_display_page'
);
}
Et voici la page affichée pour l'utilisateur avec le contenu de son dossier et quelques fonctions auxiliaires:
function wpse_75873_display_page()
{
echo '<div id="icon-upload" class="icon32"></div><h2>User Photos</h2>';
$baseDir = WP_CONTENT_DIR . '/user-photos/';
$baseUrl = WP_CONTENT_URL . '/user-photos/';
// build user folder
global $current_user;
get_currentuserinfo();
$userDir = $baseDir . $current_user->data->user_login . '/';
$userUrl = $baseUrl . $current_user->data->user_login . '/';
if( !is_dir( $userDir ) )
{
echo '<div style="margin-top:30px;font-size:2em;font-weight:bold;color:#f00">
Folder does not exist!
</div>';
return;
}
// build array with files in user folder
$files = array();
if ( $dir = opendir( $userDir ) )
{
while ( $file = readdir( $dir ) )
{
if ( $file != "." && $file != '..' )
{
if ( !is_dir( $userDir . $file ) )
{
// Hide files that start with a dot
if( !so_834303_starts_with( $file, '.' ) )
{
$size = so_13416177_file_size(
filesize( $userDir . $file )
);
$files[] = array( $file, $size );
}
}
}
}
closedir($dir);
}
if ( empty( $files ) )
{
echo '<div style="margin-top:30px;font-size:2em;font-weight:bold;color:#00f">
No photos!
</div>';
}
else
{
?>
<table class="widefat">
<thead>
<tr>
<th style="width:20%">Thumbnail</th>
<th>File</th>
<th>Size</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Thumbnail</th>
<th>File</th>
<th>Size</th>
</tr>
</tfoot>
<tbody>
<?php
foreach ($files as $file)
{
?>
<tr>
<td><!-- THIS IS NOT A THUMBNAIL -->
<?php echo '<img src="' . $userUrl . $file[0] . '" width="50">'; ?>
</td>
<td>
<a href="<?php echo $userUrl . $file[0]; ?>">
<?php echo $file[0]; ?>
</a>
</td>
<td><b><?php echo $file[1]; ?></b></td>
</tr>
<?php
}
?>
</tbody>
</table>
<?php
} // end else
}
// https://stackoverflow.com/q/834303
function so_834303_starts_with( $haystack, $needle )
{
return !strncmp( $haystack, $needle, strlen( $needle ) );
}
// http://www.php.net/manual/en/function.filesize.php#110739
function so_13416177_file_size( $o, $depth=0 )
{
if( $o > 1024 )
return so_13416177_file_size( $o/1024, $depth+1 );
$unit = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'PB', 'ZB', 'YB' );
return sprintf( '%.01f %s', $o, $unit[$depth] );
}
Basé sur une réponse récente dans StackOverflow . Le code est adapté et amélioré.