Version Description
Download this release
Release Info
Developer | westonruter |
Plugin | User Photo |
Version | 0.7 |
Comparing to | |
See all releases |
Version 0.7
- admin.css +54 -0
- readme.txt +25 -0
- user-photo.php +585 -0
admin.css
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
|
3 |
+
#userphoto-status-pending {
|
4 |
+
background-color:yellow;
|
5 |
+
padding:3px;
|
6 |
+
}
|
7 |
+
#userphoto-upload-error,
|
8 |
+
#userphoto-status-rejected {
|
9 |
+
color:red;
|
10 |
+
}
|
11 |
+
|
12 |
+
#userphoto .field-hint {
|
13 |
+
color:gray;
|
14 |
+
font-size:smaller
|
15 |
+
}
|
16 |
+
#userphoto_delete {
|
17 |
+
width:auto !important;
|
18 |
+
}
|
19 |
+
#userphoto-approvalstatus-controls.pending label {
|
20 |
+
background-color:yellow;
|
21 |
+
/*padding:3px;*/
|
22 |
+
padding:4px 0 4px 5px;
|
23 |
+
}
|
24 |
+
|
25 |
+
#userphoto_level_moderated option.none,
|
26 |
+
#userphoto_admin_notified option.none {
|
27 |
+
font-style:italic;
|
28 |
+
}
|
29 |
+
|
30 |
+
#userphoto p.image {
|
31 |
+
border:solid 1px #CCC;
|
32 |
+
text-align:center;
|
33 |
+
padding:3px;
|
34 |
+
float:left;
|
35 |
+
margin-right:20px;
|
36 |
+
margin-bottom:0;
|
37 |
+
}
|
38 |
+
#userphoto hr {
|
39 |
+
clear:both;
|
40 |
+
margin:0;
|
41 |
+
padding:0;
|
42 |
+
height:1px;
|
43 |
+
visibility:hidden;
|
44 |
+
}
|
45 |
+
|
46 |
+
#userphoto p.image img {
|
47 |
+
/*padding:2px;*/
|
48 |
+
border:solid 1px #CCC;
|
49 |
+
}
|
50 |
+
|
51 |
+
#userphoto_options_form input[type=number],
|
52 |
+
#userphoto_options_form input[type=range]{
|
53 |
+
text-align:right;
|
54 |
+
}
|
readme.txt
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
=== Plugin Name ===
|
2 |
+
Contributors: westonruter
|
3 |
+
Tags: users, photos, images
|
4 |
+
Tested up to: 2.3.1
|
5 |
+
Stable tag: 0.7
|
6 |
+
|
7 |
+
Allows a user to associate a photo with their account and for this photo to be displayed in their posts and comments.
|
8 |
+
|
9 |
+
== Description ==
|
10 |
+
|
11 |
+
Allows users to associate photos with their accounts by accessing their "Your Profile" page. Admins may
|
12 |
+
add a user photo by accessing the "Edit User" page. Uploaded images are resized to fit the dimensions specified
|
13 |
+
on the options page; a thumbnail image is also generated. New template tags introduced are:
|
14 |
+
|
15 |
+
* <code>the_author_photo()</code>
|
16 |
+
* <code>the_author_thumbnail()</code>
|
17 |
+
* <code>comment_author_photo()</code>
|
18 |
+
* <code>comment_author_thumbnail()</code>
|
19 |
+
|
20 |
+
Uploaded images may be moderated by administrators via the "Edit User" page.
|
21 |
+
|
22 |
+
== Todo ==
|
23 |
+
1. Add a management page to allow admins to quickly approve/reject user photos.
|
24 |
+
1. Add option so that when a photo is rejected, the user is notified.
|
25 |
+
1. Restrict image types acceptable?
|
user-photo.php
ADDED
@@ -0,0 +1,585 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
Plugin Name: User Photo
|
5 |
+
Plugin URI: http://wordpress.org/extend/plugins/user-photo/
|
6 |
+
Description: Allows users to associate photos with their accounts by accessing their "Your Profile" page. Uploaded images are resized to fit the dimensions specified on the options page; a thumbnail image is also generated. New template tags introduced are: <code>the_author_photo</code>, <code>the_author_thumbnail</code>, <code>comment_author_photo</code>, and <code>comment_author_thumbnail</code>. Uploaded images may be moderated by administrators.
|
7 |
+
Author: Weston Ruter
|
8 |
+
Version: 0.7
|
9 |
+
Author URI: http://weston.ruter.net/
|
10 |
+
|
11 |
+
*/
|
12 |
+
|
13 |
+
if(!function_exists('imagecopyresampled'))
|
14 |
+
trigger_error(__("Plugin not usable on this system because image resizing is not available, specifically the imagecopyresampled() and related functions.", 'userphoto'), E_USER_ERROR);
|
15 |
+
|
16 |
+
|
17 |
+
$userphoto_validtypes = array(
|
18 |
+
"image/jpeg" => true,
|
19 |
+
"image/pjpeg" => true,
|
20 |
+
"image/gif" => true,
|
21 |
+
"image/png" => true,
|
22 |
+
"image/x-png" => true
|
23 |
+
);
|
24 |
+
|
25 |
+
define('USERPHOTO_PENDING', 0);
|
26 |
+
define('USERPHOTO_REJECTED', 1);
|
27 |
+
define('USERPHOTO_APPROVED', 2);
|
28 |
+
#define('USERPHOTO_DEFAULT_MAX_DIMENSION', 150);
|
29 |
+
#define('USERPHOTO_DEFAULT_THUMB_DIMENSION', 80);
|
30 |
+
#define('USERPHOTO_DEFAULT_JPEG_COMPRESSION', 90);
|
31 |
+
#define('USERPHOTO_DEFAULT_LEVEL_MODERATED', 2);
|
32 |
+
|
33 |
+
add_option("userphoto_jpeg_compression", 90);
|
34 |
+
add_option("userphoto_maximum_dimension", 150);
|
35 |
+
add_option("userphoto_thumb_dimension", 80);
|
36 |
+
add_option("userphoto_admin_notified", 0); //0 means disable
|
37 |
+
add_option("userphoto_level_moderated", 2); //Note: -1 means disable
|
38 |
+
|
39 |
+
function get_the_author_photo($user_id = false){
|
40 |
+
global $authordata;
|
41 |
+
global $comment;
|
42 |
+
if(!$user_id){
|
43 |
+
if(isset($comment) && $comment->user_id)
|
44 |
+
$user_id = $comment->user_id;
|
45 |
+
else if(isset($authordata))
|
46 |
+
$user_id = $authordata->ID;
|
47 |
+
else trigger_error("Unable to discern user ID.");
|
48 |
+
}
|
49 |
+
if(($userdata = get_userdata($user_id)) && $userdata->userphoto_image_file){
|
50 |
+
print '<img src="' . get_option('home') . '/wp-content/uploads/userphoto/' . $userdata->userphoto_image_file . '"';
|
51 |
+
print ' alt="' . htmlspecialchars($userdata->display_name) . '"';
|
52 |
+
print ' width="' . htmlspecialchars($userdata->userphoto_image_width) . '"';
|
53 |
+
print ' height="' . htmlspecialchars($userdata->userphoto_image_height) . '"';
|
54 |
+
print " />";
|
55 |
+
}
|
56 |
+
}
|
57 |
+
function get_the_author_thumbnail($user_id){
|
58 |
+
global $authordata;
|
59 |
+
global $comment;
|
60 |
+
if(!$user_id){
|
61 |
+
if(isset($comment) && $comment->user_id)
|
62 |
+
$user_id = $comment->user_id;
|
63 |
+
else if(isset($authordata))
|
64 |
+
$user_id = $authordata->ID;
|
65 |
+
else trigger_error("Unable to discern user ID.");
|
66 |
+
}
|
67 |
+
if(($userdata = get_userdata($user_id)) && $userdata->userphoto_thumb_file){
|
68 |
+
print '<img src="' . get_option('home') . '/wp-content/uploads/userphoto/' . $userdata->userphoto_thumb_file . '"';
|
69 |
+
print ' alt="' . htmlspecialchars($userdata->display_name) . '"';
|
70 |
+
print ' width="' . htmlspecialchars($userdata->userphoto_thumb_width) . '"';
|
71 |
+
print ' height="' . htmlspecialchars($userdata->userphoto_thumb_height) . '"';
|
72 |
+
print " />";
|
73 |
+
}
|
74 |
+
}
|
75 |
+
|
76 |
+
function comment_author_photo(){
|
77 |
+
global $comment;
|
78 |
+
echo get_the_author_photo($comment->user_id);
|
79 |
+
}
|
80 |
+
function comment_author_thumbnail(){
|
81 |
+
global $comment;
|
82 |
+
echo get_the_author_thumbnail($comment->user_id);
|
83 |
+
}
|
84 |
+
function the_author_photo(){
|
85 |
+
global $authordata;
|
86 |
+
echo get_the_author_photo($authordata->ID);
|
87 |
+
}
|
88 |
+
function the_author_thumbnail(){
|
89 |
+
global $authordata;
|
90 |
+
echo get_the_author_thumbnail($authordata->ID);
|
91 |
+
}
|
92 |
+
|
93 |
+
|
94 |
+
function userphoto_profile_update($userID){
|
95 |
+
global $userphoto_validtypes;
|
96 |
+
global $current_user;
|
97 |
+
|
98 |
+
$userdata = get_userdata($userID);
|
99 |
+
|
100 |
+
#Delete photo
|
101 |
+
if(@$_POST['userphoto_delete']){
|
102 |
+
delete_usermeta($userID, "userphoto_error");
|
103 |
+
if($userdata->userphoto_image_file){
|
104 |
+
$imagepath = ABSPATH . "/wp-content/uploads/userphoto/" . basename($userdata->userphoto_image_file);
|
105 |
+
$thumbpath = ABSPATH . "/wp-content/uploads/userphoto/" . basename($userdata->userphoto_image_file);
|
106 |
+
|
107 |
+
if(file_exists($imagepath) && !@unlink($imagepath)){
|
108 |
+
update_usermeta($userID, 'userphoto_error', __("Unable to delete photo.", 'userphoto'));
|
109 |
+
}
|
110 |
+
else {
|
111 |
+
delete_usermeta($userID, "userphoto_image_file");
|
112 |
+
delete_usermeta($userID, "userphoto_approvalstatus");
|
113 |
+
delete_usermeta($userID, "userphoto_image_width");
|
114 |
+
delete_usermeta($userID, "userphoto_image_height");
|
115 |
+
}
|
116 |
+
}
|
117 |
+
}
|
118 |
+
#Upload photo or change approval status
|
119 |
+
else {
|
120 |
+
#Upload the file
|
121 |
+
if(isset($_FILES['userphoto_image_file']) && @$_FILES['userphoto_image_file']['name']){
|
122 |
+
|
123 |
+
#Upload error
|
124 |
+
$error = '';
|
125 |
+
if($_FILES['userphoto_image_file']['error']){
|
126 |
+
switch($_FILES['userphoto_image_file']['error']){
|
127 |
+
case UPLOAD_ERR_INI_SIZE:
|
128 |
+
case UPLOAD_ERR_FORM_SIZE:
|
129 |
+
$error = __("The uploaded file exceeds the max upload size.", 'userphoto');
|
130 |
+
break;
|
131 |
+
case UPLOAD_ERR_PARTIAL:
|
132 |
+
$error = __("The uploaded file was only partially uploaded.", 'userphoto');
|
133 |
+
break;
|
134 |
+
case UPLOAD_ERR_NO_FILE:
|
135 |
+
$error = __("No file was uploaded.", 'userphoto');
|
136 |
+
break;
|
137 |
+
case UPLOAD_ERR_NO_TMP_DIR:
|
138 |
+
$error = __("Missing a temporary folder.", 'userphoto');
|
139 |
+
break;
|
140 |
+
case UPLOAD_ERR_CANT_WRITE:
|
141 |
+
$error = __("Failed to write file to disk.", 'userphoto');
|
142 |
+
break;
|
143 |
+
case UPLOAD_ERR_EXTENSION:
|
144 |
+
$error = __("File upload stopped by extension.", 'userphoto');
|
145 |
+
break;
|
146 |
+
default:
|
147 |
+
$error = __("File upload failed due to unknown error.", 'userphoto');
|
148 |
+
}
|
149 |
+
}
|
150 |
+
else if(!$_FILES['userphoto_image_file']['size'])
|
151 |
+
$error = sprintf(__("The file “%s” was not uploaded. Did you provide the correct filename?", 'userphoto'), $_FILES['userphoto_image_file']['name']);
|
152 |
+
else if(@!$userphoto_validtypes[$_FILES['userphoto_image_file']['type']]) //!preg_match("/\.(" . join('|', $userphoto_validextensions) . ")$/i", $_FILES['userphoto_image_file']['name'])) ||
|
153 |
+
$error = sprintf(__("The uploaded file type “%s” is not allowed.", 'userphoto'), $_FILES['userphoto_image_file']['type']);
|
154 |
+
|
155 |
+
$tmppath = $_FILES['userphoto_image_file']['tmp_name'];
|
156 |
+
|
157 |
+
$imageinfo = null;
|
158 |
+
$thumbinfo = null;
|
159 |
+
if(!$error){
|
160 |
+
$userphoto_maximum_dimension = get_option( 'userphoto_maximum_dimension' );
|
161 |
+
#if(empty($userphoto_maximum_dimension))
|
162 |
+
# $userphoto_maximum_dimension = USERPHOTO_DEFAULT_MAX_DIMENSION;
|
163 |
+
|
164 |
+
$imageinfo = getimagesize($tmppath);
|
165 |
+
if(!$imageinfo || !$imageinfo[0] || !$imageinfo[1])
|
166 |
+
$error = __("Unable to get image dimensions.", 'userphoto');
|
167 |
+
else if($imageinfo[0] > $userphoto_maximum_dimension || $imageinfo[1] > $userphoto_maximum_dimension){
|
168 |
+
if(userphoto_resize_image($tmppath, null, $userphoto_maximum_dimension, $error))
|
169 |
+
$imageinfo = getimagesize($tmppath);
|
170 |
+
}
|
171 |
+
|
172 |
+
//else if($imageinfo[0] > $userphoto_maximum_dimension)
|
173 |
+
// $error = sprintf(__("The uploaded image had a width of %d pixels. The max width is %d.", 'userphoto'), $imageinfo[0], $userphoto_maximum_dimension);
|
174 |
+
//else if($imageinfo[0] > $userphoto_maximum_dimension)
|
175 |
+
// $error = sprintf(__("The uploaded image had a height of %d pixels. The max height is %d.", 'userphoto'), $imageinfo[1], $userphoto_maximum_dimension);
|
176 |
+
}
|
177 |
+
|
178 |
+
if(!$error){
|
179 |
+
$dir = ABSPATH . "/wp-content/uploads/userphoto";
|
180 |
+
#$umask = umask(0);
|
181 |
+
if(!file_exists($dir) && !mkdir($dir, 0777))
|
182 |
+
$error = __("The userphoto upload content directory does not exist and could not be created.", 'userphoto');
|
183 |
+
#umask($umask);
|
184 |
+
|
185 |
+
if(!$error){
|
186 |
+
#$oldFile = basename($userdata->userphoto_image_file);
|
187 |
+
$imagefile = preg_replace('/^.+(?=\.\w+$)/', $userdata->user_nicename, $_FILES['userphoto_image_file']['name']);
|
188 |
+
$imagepath = $dir . '/' . $imagefile;
|
189 |
+
$thumbfile = preg_replace("/(?=\.\w+$)/", '.thumbnail', $imagefile);
|
190 |
+
$thumbpath = $dir . '/' . $thumbfile;
|
191 |
+
|
192 |
+
if(!move_uploaded_file($tmppath, $imagepath)){
|
193 |
+
$error = __("Unable to move the file to the user photo upload content directory.", 'userphoto');
|
194 |
+
}
|
195 |
+
else {
|
196 |
+
#Generate thumbnail
|
197 |
+
$userphoto_thumb_dimension = get_option( 'userphoto_thumb_dimension' );
|
198 |
+
#if(empty($userphoto_thumb_dimension))
|
199 |
+
# $userphoto_thumb_dimension = USERPHOTO_DEFAULT_THUMB_DIMENSION;
|
200 |
+
if(!($userphoto_thumb_dimension >= $imageinfo[0] && $userphoto_thumb_dimension >= $imageinfo[1])){
|
201 |
+
userphoto_resize_image($imagepath, $thumbpath, $userphoto_thumb_dimension, $error);
|
202 |
+
}
|
203 |
+
else {
|
204 |
+
copy($imagepath, $thumbpath);
|
205 |
+
}
|
206 |
+
$thumbinfo = getimagesize($thumbpath);
|
207 |
+
|
208 |
+
#Update usermeta
|
209 |
+
if($current_user->user_level <= get_option('userphoto_level_moderated') ){
|
210 |
+
update_usermeta($userID, "userphoto_approvalstatus", USERPHOTO_PENDING);
|
211 |
+
|
212 |
+
$admin_notified = get_option('userphoto_admin_notified');
|
213 |
+
if($admin_notified){
|
214 |
+
$admin = get_userdata($admin_notified);
|
215 |
+
@mail($admin->user_email,
|
216 |
+
"User Photo for " . $userdata->display_name . " Needs Approval",
|
217 |
+
get_option("home") . "/wp-admin/user-edit.php?user_id=" . $userdata->ID . "#userphoto");
|
218 |
+
}
|
219 |
+
}
|
220 |
+
else {
|
221 |
+
update_usermeta($userID, "userphoto_approvalstatus", USERPHOTO_APPROVED);
|
222 |
+
}
|
223 |
+
update_usermeta($userID, "userphoto_image_file", $imagefile); //TODO: use userphoto_image
|
224 |
+
update_usermeta($userID, "userphoto_image_width", $imageinfo[0]); //TODO: use userphoto_image_width
|
225 |
+
update_usermeta($userID, "userphoto_image_height", $imageinfo[1]);
|
226 |
+
update_usermeta($userID, "userphoto_thumb_file", $thumbfile);
|
227 |
+
update_usermeta($userID, "userphoto_thumb_width", $thumbinfo[0]);
|
228 |
+
update_usermeta($userID, "userphoto_thumb_height", $thumbinfo[1]);
|
229 |
+
|
230 |
+
#if($oldFile && $oldFile != $newFile)
|
231 |
+
# @unlink($dir . '/' . $oldFile);
|
232 |
+
}
|
233 |
+
}
|
234 |
+
}
|
235 |
+
}
|
236 |
+
|
237 |
+
#Set photo approval status
|
238 |
+
if($current_user->has_cap('edit_users') &&
|
239 |
+
array_key_exists('userphoto_approvalstatus', $_POST) &&
|
240 |
+
in_array((int)$_POST['userphoto_approvalstatus'], array(USERPHOTO_PENDING, USERPHOTO_REJECTED, USERPHOTO_APPROVED))
|
241 |
+
){
|
242 |
+
update_usermeta($userID, "userphoto_approvalstatus", (int)$_POST['userphoto_approvalstatus']);
|
243 |
+
if((int)$_POST['userphoto_approvalstatus'] == USERPHOTO_REJECTED)
|
244 |
+
update_usermeta($userID, "userphoto_rejectionreason", $_POST['userphoto_rejectionreason']);
|
245 |
+
else
|
246 |
+
delete_usermeta($userID, "userphoto_rejectionreason");
|
247 |
+
}
|
248 |
+
}
|
249 |
+
|
250 |
+
if($error)
|
251 |
+
update_usermeta($userID, 'userphoto_error', $error);
|
252 |
+
else
|
253 |
+
delete_usermeta($userID, "userphoto_error");
|
254 |
+
}
|
255 |
+
add_action('profile_update', 'userphoto_profile_update');
|
256 |
+
#add_action('personal_options_update', ???);
|
257 |
+
|
258 |
+
#QUESTION: Should we store a serialized datastructure in the usermeta...
|
259 |
+
# Width, height, size, filename/path
|
260 |
+
|
261 |
+
|
262 |
+
function userphoto_delete_user($userID){
|
263 |
+
$userdata = get_userdata($userID);
|
264 |
+
if($userdata->userphoto_image_file)
|
265 |
+
@unlink(ABSPATH . "/wp-content/uploads/userphoto/" . basename($userdata->userphoto_image_file));
|
266 |
+
if($userdata->userphoto_thumb_file)
|
267 |
+
@unlink(ABSPATH . "/wp-content/uploads/userphoto/" . basename($userdata->userphoto_thumb_file));
|
268 |
+
}
|
269 |
+
add_action('delete_user', 'userphoto_delete_user');
|
270 |
+
|
271 |
+
|
272 |
+
function userphoto_admin_useredit_head(){
|
273 |
+
if(preg_match("/(user-edit\.php|profile.php)$/", $_SERVER['PHP_SELF']))
|
274 |
+
print '<link rel="stylesheet" href="../wp-content/plugins/userphoto/admin.css" />';
|
275 |
+
}
|
276 |
+
function userphoto_admin_options_head(){
|
277 |
+
print '<link rel="stylesheet" href="../wp-content/plugins/userphoto/admin.css" />';
|
278 |
+
}
|
279 |
+
|
280 |
+
add_action('admin_head-options_page_userphoto/userphoto', 'userphoto_admin_options_head');
|
281 |
+
add_action('admin_head', 'userphoto_admin_useredit_head');
|
282 |
+
#add_action('admin_head-userphoto', 'userphoto_admin_head');
|
283 |
+
|
284 |
+
function userphoto_display_selector_fieldset(){
|
285 |
+
#NOTE: an email needs to be sent to the admin when a contributor uploads a photo
|
286 |
+
|
287 |
+
global $profileuser;
|
288 |
+
global $current_user;
|
289 |
+
global $userphoto_error;
|
290 |
+
|
291 |
+
$isSelf = $profileuser->ID == $current_user->ID;
|
292 |
+
|
293 |
+
#if($isSelf)
|
294 |
+
# $userdata = get_userdata($profileuser->ID);
|
295 |
+
#else
|
296 |
+
# $userdata = get_userdata($current_user->ID);
|
297 |
+
|
298 |
+
#$userphoto = unserialize($userdata->userphoto);
|
299 |
+
|
300 |
+
?>
|
301 |
+
<fieldset id='userphoto'>
|
302 |
+
<script type="text/javascript">
|
303 |
+
var form = document.getElementById('your-profile');
|
304 |
+
//form.enctype = "multipart/form-data"; //FireFox, Opera, et al
|
305 |
+
form.encoding = "multipart/form-data"; //IE5.5
|
306 |
+
form.setAttribute('enctype', 'multipart/form-data'); //required for IE6 (is interpreted into "encType")
|
307 |
+
|
308 |
+
function userphoto_onclick(){
|
309 |
+
var is_delete = document.getElementById('userphoto_delete').checked;
|
310 |
+
document.getElementById('userphoto_image_file').disabled = is_delete;
|
311 |
+
|
312 |
+
if(document.getElementById('userphoto_approvalstatus'))
|
313 |
+
document.getElementById('userphoto_approvalstatus').disabled = is_delete;
|
314 |
+
if(document.getElementById('userphoto_rejectionreason'))
|
315 |
+
document.getElementById('userphoto_rejectionreason').disabled = is_delete;
|
316 |
+
}
|
317 |
+
function userphoto_approvalstatus_onchange(){
|
318 |
+
var select = document.getElementById('userphoto_approvalstatus');
|
319 |
+
document.getElementById('userphoto_rejectionreason').style.display = (select.options[select.selectedIndex].value == <?php echo USERPHOTO_REJECTED ?> ? 'block' : 'none');
|
320 |
+
}
|
321 |
+
<?php if($profileuser->userphoto_error && @$_POST['action'] == 'update'): ?>
|
322 |
+
window.location = "#userphoto";
|
323 |
+
<?php endif; ?>
|
324 |
+
|
325 |
+
</script>
|
326 |
+
<legend><?php echo $isSelf ? _e("Your Photo", 'userphoto') : _e("User Photo", 'userphoto') ?></legend>
|
327 |
+
<?php if($profileuser->userphoto_image_file): ?>
|
328 |
+
<p class='image'><img src="<?php echo get_option('home') . '/wp-content/uploads/userphoto/' . $profileuser->userphoto_image_file . "?" . rand() ?>" alt="Full size image" /><br />
|
329 |
+
Full size
|
330 |
+
</p>
|
331 |
+
<p class='image'><img src="<?php echo get_option('home') . '/wp-content/uploads/userphoto/' . $profileuser->userphoto_thumb_file . "?" . rand() ?>" alt="Thumbnail image" /><br />
|
332 |
+
Thumb
|
333 |
+
</p>
|
334 |
+
<hr />
|
335 |
+
|
336 |
+
<?php if(!$current_user->has_cap('edit_users')): ?>
|
337 |
+
<?php if($profileuser->userphoto_approvalstatus == USERPHOTO_PENDING): ?>
|
338 |
+
<p id='userphoto-status-pending'><?php echo _e("Your profile photo has been submitted for review.", 'userphoto') ?></p>
|
339 |
+
<?php elseif($profileuser->userphoto_approvalstatus == USERPHOTO_REJECTED): ?>
|
340 |
+
<p id='userphoto-status-rejected'><strong>Notice: </strong> <?php _e("Your chosen profile photo has been rejected.", 'userphoto') ?>
|
341 |
+
<?php
|
342 |
+
if($profileuser->userphoto_rejectionreason){
|
343 |
+
_e("Reason: ", 'userphoto');
|
344 |
+
echo htmlspecialchars($profileuser->userphoto_rejectionreason);
|
345 |
+
}
|
346 |
+
?>
|
347 |
+
</p>
|
348 |
+
<?php endif; ?>
|
349 |
+
<?php endif; ?>
|
350 |
+
<?php endif; ?>
|
351 |
+
|
352 |
+
<?php if($profileuser->userphoto_error): ?>
|
353 |
+
<p id='userphoto-upload-error'><strong>Upload error:</strong> <?php echo $profileuser->userphoto_error ?></p>
|
354 |
+
<?php endif; ?>
|
355 |
+
<p id='userphoto_image_file_control'>
|
356 |
+
<label><?php echo _e("Upload image file:", 'userphoto') ?>
|
357 |
+
<span class='field-hint'>(<?php
|
358 |
+
//if(!get_option('userphoto_autoresize'))
|
359 |
+
// printf(__("max dimensions %d×%d;"), get_option('userphoto_maximum_dimension'), get_option('userphoto_maximum_dimension'));
|
360 |
+
printf(__("max upload size %s"),ini_get("upload_max_filesize"));
|
361 |
+
?>)</span>
|
362 |
+
<input type="file" name="userphoto_image_file" id="userphoto_image_file" /></label>
|
363 |
+
</p>
|
364 |
+
<!--<em>or</em>
|
365 |
+
<label for="uphoto-fileURL">Image URL: </label><input type="url" name="uphoto-fileURL" id="uphoto-fileURL" value="http://" /><br />-->
|
366 |
+
<?php if($current_user->has_cap('edit_users') && ($profileuser->ID != $current_user->ID) && $profileuser->userphoto_image_file): ?>
|
367 |
+
<p id="userphoto-approvalstatus-controls" <?php if($profileuser->userphoto_approvalstatus == USERPHOTO_PENDING) echo "class='pending'" ?>>
|
368 |
+
<label><?php _e("Approval status:", 'userphoto') ?>
|
369 |
+
<select name="userphoto_approvalstatus" id="userphoto_approvalstatus" onchange="userphoto_approvalstatus_onchange()">
|
370 |
+
<option value="<?php echo USERPHOTO_PENDING ?>" <?php if($profileuser->userphoto_approvalstatus == USERPHOTO_PENDING) echo " selected='selected' " ?>><?php _e("pending", 'userphoto') ?></option>
|
371 |
+
<option value="<?php echo USERPHOTO_REJECTED ?>" <?php if($profileuser->userphoto_approvalstatus == USERPHOTO_REJECTED) echo " selected='selected' " ?>><?php _e("rejected", 'userphoto') ?></option>
|
372 |
+
<option value="<?php echo USERPHOTO_APPROVED ?>" <?php if($profileuser->userphoto_approvalstatus == USERPHOTO_APPROVED) echo " selected='selected' " ?>><?php _e("approved", 'userphoto') ?></option>
|
373 |
+
</select></label><br /><textarea name="userphoto_rejectionreason" <?php
|
374 |
+
if($profileuser->userphoto_approvalstatus != USERPHOTO_REJECTED)
|
375 |
+
echo ' style="display:none"';
|
376 |
+
?> id="userphoto_rejectionreason"><?php echo $profileuser->userphoto_rejectionreason ? $profileuser->userphoto_rejectionreason : __('The photo is inappropriate.', 'userphoto') ?></textarea>
|
377 |
+
</p>
|
378 |
+
<script type="text/javascript">userphoto_approvalstatus_onchange()</script>
|
379 |
+
<?php endif; ?>
|
380 |
+
<?php if($profileuser->userphoto_image_file): ?>
|
381 |
+
<p><label><input type="checkbox" name="userphoto_delete" id="userphoto_delete" onclick="userphoto_onclick()" /> <?php _e('Delete photo?', 'userphoto')?></label></p>
|
382 |
+
<?php endif; ?>
|
383 |
+
</fieldset>
|
384 |
+
<?php
|
385 |
+
}
|
386 |
+
add_action('show_user_profile', 'userphoto_display_selector_fieldset');
|
387 |
+
add_action('edit_user_profile', 'userphoto_display_selector_fieldset');
|
388 |
+
|
389 |
+
/***** ADMIN ******************************************/
|
390 |
+
|
391 |
+
function userphoto_add_page() {
|
392 |
+
//if (function_exists('add_options_page'))
|
393 |
+
add_options_page('User Photo', 'User Photo', 8, __FILE__, 'userphoto_options_page');
|
394 |
+
}
|
395 |
+
add_action('admin_menu', 'userphoto_add_page');
|
396 |
+
|
397 |
+
function userphoto_options_page(){
|
398 |
+
#Get option values
|
399 |
+
$userphoto_jpeg_compression = get_option( 'userphoto_jpeg_compression' );
|
400 |
+
$userphoto_maximum_dimension = get_option( 'userphoto_maximum_dimension' );
|
401 |
+
$userphoto_thumb_dimension = get_option( 'userphoto_thumb_dimension' );
|
402 |
+
$userphoto_admin_notified = get_option( 'userphoto_admin_notified' );
|
403 |
+
$userphoto_level_moderated = get_option( 'userphoto_level_moderated' );
|
404 |
+
|
405 |
+
#Get new updated option values, and save them
|
406 |
+
if( @$_POST['action'] == 'update' ) {
|
407 |
+
$userphoto_jpeg_compression = (int)$_POST['userphoto_jpeg_compression'];
|
408 |
+
update_option('userphoto_jpeg_compression', $userphoto_jpeg_compression);
|
409 |
+
|
410 |
+
$userphoto_maximum_dimension = (int)$_POST['userphoto_maximum_dimension'];
|
411 |
+
update_option('userphoto_maximum_dimension', $userphoto_maximum_dimension);
|
412 |
+
|
413 |
+
$userphoto_thumb_dimension = (int)$_POST['userphoto_thumb_dimension'];
|
414 |
+
update_option('userphoto_thumb_dimension', $userphoto_thumb_dimension);
|
415 |
+
|
416 |
+
$userphoto_admin_notified = (int)$_POST['userphoto_admin_notified'];
|
417 |
+
update_option('userphoto_admin_notified', $userphoto_admin_notified);
|
418 |
+
|
419 |
+
$userphoto_level_moderated = (int)$_POST['userphoto_level_moderated'];
|
420 |
+
update_option('userphoto_level_moderated', $userphoto_level_moderated);
|
421 |
+
|
422 |
+
?>
|
423 |
+
<div class="updated"><p><strong><?php _e('Options saved.' ); ?></strong></p></div>
|
424 |
+
<?php
|
425 |
+
}
|
426 |
+
|
427 |
+
?>
|
428 |
+
<div class="wrap">
|
429 |
+
<h2>User Photo Options</h2>
|
430 |
+
<form method="post" action="options.php" id='userphoto_options_form'>
|
431 |
+
<?php wp_nonce_field('update-options') ?>
|
432 |
+
<p>
|
433 |
+
<label>
|
434 |
+
<?php _e("Maximum dimension: ", 'userphoto') ?>
|
435 |
+
<input type="number" min="1" step="1" size="3" name="userphoto_maximum_dimension" value="<?php echo $userphoto_maximum_dimension ?>" />px
|
436 |
+
</label>
|
437 |
+
</p>
|
438 |
+
<p>
|
439 |
+
<label>
|
440 |
+
<?php _e("Thumbnail dimension: ", 'userphoto') ?>
|
441 |
+
<input type="number" min="1" step="1" size="3" name="userphoto_thumb_dimension" value="<?php echo $userphoto_thumb_dimension ?>" />px
|
442 |
+
</label>
|
443 |
+
</p>
|
444 |
+
<p>
|
445 |
+
<label>
|
446 |
+
<?php _e("JPEG compression: ", 'userphoto') ?>
|
447 |
+
<input type="range" min="1" max="100" step="1" size="3" name="userphoto_jpeg_compression" value="<?php echo $userphoto_jpeg_compression ?>" />%
|
448 |
+
</label>
|
449 |
+
</p>
|
450 |
+
<p>
|
451 |
+
<label>
|
452 |
+
<?php _e("Notify this administrator by email when user photo needs approval: ", 'userphoto') ?>
|
453 |
+
<select id='userphoto_admin_notified' name="userphoto_admin_notified">
|
454 |
+
<option value="0" class='none'>(none)</option>
|
455 |
+
<?php
|
456 |
+
global $wpdb;
|
457 |
+
$users = $wpdb->get_results("SELECT ID FROM $wpdb->users ORDER BY user_login");
|
458 |
+
foreach($users as $user){
|
459 |
+
$u = get_userdata($user->ID);
|
460 |
+
if($u->user_level == 10){ #if($u->has_cap('administrator')){
|
461 |
+
print "<option value='" . $u->ID . "'";
|
462 |
+
if($userphoto_admin_notified == $u->ID)
|
463 |
+
print " selected='selected'";
|
464 |
+
print ">" . $u->user_login . "</option>";
|
465 |
+
}
|
466 |
+
}
|
467 |
+
?>
|
468 |
+
</select>
|
469 |
+
</label>
|
470 |
+
</p>
|
471 |
+
<p>
|
472 |
+
<label>
|
473 |
+
<!--<input type="checkbox" id="userphoto_do_moderation" onclick="document.getElementById('userphoto_level_moderated').disabled = !this.checked" <?php /*if(isset($userphoto_level_moderated)) echo ' checked="checked"'*/ ?> />-->
|
474 |
+
<?php _e("Require user photo moderation for all users at or below this level: ", 'userphoto') ?>
|
475 |
+
<select name="userphoto_level_moderated" id="userphoto_level_moderated">
|
476 |
+
<option value="-1" <?php if($userphoto_level_moderated == -1) echo ' selected="selected"' ?> class='none'>(none)</option>
|
477 |
+
<option value="0" <?php if($userphoto_level_moderated == 0) echo ' selected="selected"' ?>>Subscriber</option>
|
478 |
+
<option value="1" <?php if($userphoto_level_moderated == 1) echo ' selected="selected"' ?>>Contributor</option>
|
479 |
+
<option value="2" <?php if($userphoto_level_moderated == 2) echo ' selected="selected"' ?>>Author</option>
|
480 |
+
<option value="7" <?php if($userphoto_level_moderated == 7) echo ' selected="selected"' ?>>Editor</option>
|
481 |
+
</select>
|
482 |
+
</label>
|
483 |
+
<!--<script type="text/javascript">
|
484 |
+
document.getElementById('userphoto_do_moderation').onclick();
|
485 |
+
</script>-->
|
486 |
+
</p>
|
487 |
+
|
488 |
+
<input type="hidden" name="action" value="update" />
|
489 |
+
<input type="hidden" name="page_options" value="userphoto_jpeg_compression,userphoto_admin_notified,userphoto_maximum_dimension,userphoto_thumb_dimension,userphoto_level_moderated" />
|
490 |
+
|
491 |
+
<p class="submit">
|
492 |
+
<input type="submit" name="Submit" value="<?php _e('Update options »'); ?>" />
|
493 |
+
</p>
|
494 |
+
</form>
|
495 |
+
</div>
|
496 |
+
<?php
|
497 |
+
}
|
498 |
+
|
499 |
+
|
500 |
+
function userphoto_resize_image($filename, $newFilename, $maxdimension, &$error){
|
501 |
+
if(!$newFilename)
|
502 |
+
$newFilename = $filename;
|
503 |
+
$userphoto_jpeg_compression = (int)get_option( 'userphoto_jpeg_compression' );
|
504 |
+
#if(empty($userphoto_jpeg_compression))
|
505 |
+
# $userphoto_jpeg_compression = USERPHOTO_DEFAULT_JPEG_COMPRESSION;
|
506 |
+
|
507 |
+
$info = @getimagesize($filename);
|
508 |
+
if(!$info || !$info[0] || !$info[1]){
|
509 |
+
$error = __("Unable to get image dimensions.", 'userphoto');
|
510 |
+
}
|
511 |
+
//From WordPress image.php line 22
|
512 |
+
else if (
|
513 |
+
!function_exists( 'imagegif' ) && $info[2] == IMAGETYPE_GIF
|
514 |
+
||
|
515 |
+
!function_exists( 'imagejpeg' ) && $info[2] == IMAGETYPE_JPEG
|
516 |
+
||
|
517 |
+
!function_exists( 'imagepng' ) && $info[2] == IMAGETYPE_PNG
|
518 |
+
) {
|
519 |
+
$error = __( 'Filetype not supported.', 'userphoto' );
|
520 |
+
}
|
521 |
+
else {
|
522 |
+
// create the initial copy from the original file
|
523 |
+
if ( $info[2] == IMAGETYPE_GIF ) {
|
524 |
+
$image = imagecreatefromgif( $filename );
|
525 |
+
}
|
526 |
+
elseif ( $info[2] == IMAGETYPE_JPEG ) {
|
527 |
+
$image = imagecreatefromjpeg( $filename );
|
528 |
+
}
|
529 |
+
elseif ( $info[2] == IMAGETYPE_PNG ) {
|
530 |
+
$image = imagecreatefrompng( $filename );
|
531 |
+
}
|
532 |
+
if(!isset($image)){
|
533 |
+
$error = __("Unrecognized image format.", 'userphoto');
|
534 |
+
return false;
|
535 |
+
}
|
536 |
+
if ( function_exists( 'imageantialias' ))
|
537 |
+
imageantialias( $image, TRUE );
|
538 |
+
|
539 |
+
// figure out the longest side
|
540 |
+
|
541 |
+
if ( $info[0] > $info[1] ) {
|
542 |
+
$image_width = $info[0];
|
543 |
+
$image_height = $info[1];
|
544 |
+
$image_new_width = $maxdimension;
|
545 |
+
|
546 |
+
$image_ratio = $image_width / $image_new_width;
|
547 |
+
$image_new_height = $image_height / $image_ratio;
|
548 |
+
//width is > height
|
549 |
+
} else {
|
550 |
+
$image_width = $info[0];
|
551 |
+
$image_height = $info[1];
|
552 |
+
$image_new_height = $maxdimension;
|
553 |
+
|
554 |
+
$image_ratio = $image_height / $image_new_height;
|
555 |
+
$image_new_width = $image_width / $image_ratio;
|
556 |
+
//height > width
|
557 |
+
}
|
558 |
+
|
559 |
+
$imageresized = imagecreatetruecolor( $image_new_width, $image_new_height);
|
560 |
+
@ imagecopyresampled( $imageresized, $image, 0, 0, 0, 0, $image_new_width, $image_new_height, $info[0], $info[1] );
|
561 |
+
|
562 |
+
// move the thumbnail to its final destination
|
563 |
+
if ( $info[2] == IMAGETYPE_GIF ) {
|
564 |
+
if (!imagegif( $imageresized, $newFilename ) ) {
|
565 |
+
$error = __( "Thumbnail path invalid" );
|
566 |
+
}
|
567 |
+
}
|
568 |
+
elseif ( $info[2] == IMAGETYPE_JPEG ) {
|
569 |
+
if (!imagejpeg( $imageresized, $newFilename, $userphoto_jpeg_compression ) ) {
|
570 |
+
$error = __( "Thumbnail path invalid" );
|
571 |
+
}
|
572 |
+
}
|
573 |
+
elseif ( $info[2] == IMAGETYPE_PNG ) {
|
574 |
+
if (!imagepng( $imageresized, $newFilename ) ) {
|
575 |
+
$error = __( "Thumbnail path invalid" );
|
576 |
+
}
|
577 |
+
}
|
578 |
+
}
|
579 |
+
if(!empty($error))
|
580 |
+
return false;
|
581 |
+
return true;
|
582 |
+
}
|
583 |
+
|
584 |
+
|
585 |
+
?>
|