<?php
/**
* User storage model for editability
*
* @since 3.3
*/
class CACIE_Editable_Model_User extends CACIE_Editable_Model {
private $users;
public $items;
/**
* Constructor
*
* @since 3.3
*/
public function __construct( $storage_model ) {
parent::__construct( $storage_model );
add_action( 'pre_user_query', array( $this, 'populate_users' ), 99 );
}
/**
* @see CACIE_Editable_Model::is_editable()
* @since 3.3
*/
public function is_editable( $column ) {
// By default, inherit editability from parent
$is_editable = parent::is_editable( $column );
switch ( $column->properties->type ) {
// Default columns
case 'email':
case 'role':
case 'username':
// Custom columns
case 'column-first_name':
case 'column-last_name':
case 'column-meta':
case 'column-nickname':
case 'column-rich_editing':
case 'column-user_description':
case 'column-user_url':
$is_editable = true;
break;
}
/**
* Filter the editability of a column
*
* @since 3.4
*
* @param bool $is_editable Whether the column is editable
* @param CPAC_Column $column Colum object
* @param CACIE_Editable_Model $model Editability storage model
*/
$is_editable = apply_filters( 'cac/editable/is_column_editable', $is_editable, $column, $this );
$is_editable = apply_filters( 'cac/editable/is_column_editable/column=' . $column->get_type(), $is_editable, $column, $this );
return $is_editable;
}
/**
* @see CACIE_Editable_Model::get_column_options()
* @since 1.0
*/
public function get_column_options( $column ) {
$options = parent::get_column_options( $column );
switch ( $column['type'] ) {
// WP Default
case 'role':
if ( $_roles = get_editable_roles() ) {
foreach ( $_roles as $k => $role ) {
$options[ $k ] = $role['name'];
}
}
break;
}
return $options;
}
/**
* @see CACIE_Editable_Model::get_editables_data()
* @since 3.3
*/
public function get_editables_data() {
$data = array(
/**
* Default columns
*
*/
'email' => array(
'type' => 'text',
'property' => 'user_email'
),
'role' => array(
'type' => 'select',
),
'username' => array(
'type' => 'text',
'js' => array(
'selector' => 'strong > a',
),
'display_ajax' => false
),
/**
* Custom columns
*
*/
'column-first_name' => array(
'type' => 'text',
),
'column-last_name' => array(
'type' => 'text',
),
'column-nickname' => array(
'type' => 'text',
),
'column-rich_editing' => array(
'type' => 'togglable',
'options' => array( 'true', 'false' )
),
'column-user_description' => array(
'type' => 'textarea',
),
'column-user_url' => array(
'type' => 'text',
'property' => 'user_url'
),
/**
* Custom fields column
*
*/
'column-meta' => array(
// settings are set in CACIE_Editable_Model::get_columns()
)
);
/**
* Filter the editability settings for a column
*
* @since 3.4
*
* @param array $data {
* Editability settings.
*
* @type string $type Editability type. Accepts 'text', 'select', 'textarea', etc.
* @type array $options Optional. Options for dropdown ([value] => [label]), only used when $type is "select"
* }
* @param CACIE_Editable_Model $model Editability storage model
*/
$data = apply_filters( 'cac/editable/editables_data', $data, $this );
$data = apply_filters( 'cac/editable/editables_data/type=' . $this->storage_model->get_type(), $data, $this );
return $data;
}
/**
* Populate Users
*
* @since 3.3
*/
public function populate_users( $user_query ) {
global $pagenow;
// is this the users page?
if ( 'users.php' !== $pagenow ) {
return;
}
// Check whether this is the users overview page
if ( ! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'delete' ) {
return;
}
// run query
$user_query->query();
$items = array();
if ( $users = $user_query->results ) {
foreach ( $users as $user ) {
if ( ! is_a( $user, 'WP_User' ) ) {
continue;
}
if ( ! current_user_can( 'edit_user', $user->ID ) ) {
continue;
}
$columndata = array();
foreach ( $this->storage_model->columns as $column_name => $column ) {
// Edit enabled for this column?
if ( ! $this->is_edit_enabled( $column ) ) {
continue;
}
// Set current value
$value = '';
// WP Default column
if ( $column->properties->default ) {
switch ( $column_name ) {
case 'email':
$value = $user->user_email;
break;
case 'role':
$value = $user->roles[0];
break;
case 'username':
$value = $user->user_login;
break;
}
}
// Custom column
else {
$raw_value = $this->get_column_editability_value( $column, $user->ID );
if ( $raw_value === NULL ) {
continue;
}
$value = $raw_value;
}
/**
* Filter the raw value, used for editability, for a column
*
* @since 3.4
*
* @param mixed $value Column value used for editability
* @param CPAC_Column $column Colum object
* @param int $id Post ID to get the column editability for
* @param CACIE_Editable_Model $model Editability storage model
*/
$value = apply_filters( 'cac/editable/column_value', $value, $column, $user->ID, $this );
$value = apply_filters( 'cac/editable/column_value/column=' . $column->get_type(), $value, $column, $user->ID, $this );
// Get item data
$itemdata = array();
if ( method_exists( $column, 'get_item_data' ) ) {
$itemdata = $column->get_item_data( $user->ID );
}
// Add data
$columndata[ $column_name ] = array(
'revisions' => array( $value ),
'current_revision' => 0,
'itemdata' => $itemdata,
'editable' => array(
'formattedvalue' => $this->get_formatted_value( $column, $value )
)
);
}
$items[ $user->ID ] = array(
'ID' => $user->ID,
'object' => get_object_vars( $user ),
'columndata' => $columndata
);
}
}
$this->items = $items;
}
/**
* Get the available items on the current page for passing them to JS
*
* @since 3.3
*
* @return array Items on the current page
*/
public function get_items() {
return $this->items;
}
/**
* @see CACIE_Editable_Model::manage_value()
* @since 3.3
*/
public function manage_value( $column, $id ){
switch ( $column->properties->type ) {
case 'username':
$user = get_user_by( 'id', $id );
echo $user->user_login;
break;
case 'email':
$user = get_user_by( 'id', $id );
echo '<a href="mailto:' . esc_attr( $user->user_email ) . '" title="' . esc_attr( sprintf( __( 'E-mail: %s' ), $user->user_email ) ) . '">' . $user->user_email . '</a>';
break;
case 'role':
$user = get_user_by( 'id', $id );
global $wp_roles;
if ( $wp_roles && isset( $wp_roles->roles[ $user->roles[0] ] ) ) {
echo $wp_roles->roles[ $user->roles[0] ]['name'];
}
break;
}
}
/**
* @see CACIE_Editable_Model::column_save()
* @since 3.3
*/
public function column_save( $id, $column, $value ) {
if ( ! ( $user = get_user_by( 'id', $id ) ) ) {
exit;
}
if ( ! current_user_can( 'edit_user', $id ) ) {
exit;
}
// Third party columns can use the save() method as a callback for inline-editing
if ( method_exists( $column, 'save' ) ) {
$column->save( $id, $value );
return;
}
$editable = $this->get_editable( $column->properties->name );
switch ( $column->properties->type ) {
/**
* Default Columns
*
*/
case 'role':
wp_update_user( array( 'ID' => $id, 'role' => $value ) );
break;
case 'username':
global $wpdb;
$value = sanitize_user( $value, true );
if ( $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(1) FROM {$wpdb->users} WHERE user_login = %s AND ID != %d", $value, $id ) ) ) {
return new WP_Error( 'cacie_error_username_exists', __( 'The username already exists.', 'codepress-admin-columns' ) );
}
$wpdb->update(
$wpdb->users,
array( 'user_login' => $value ),
array( 'ID' => $id ),
array( '%s' ),
array( '%d' )
);
clean_user_cache( $id );
break;
/**
* Custom Columns
*/
case 'column-meta':
$this->update_meta( $user->ID, $column->get_field_key(), $value );
break;
case 'column-first_name':
$this->update_meta( $user->ID, 'first_name', $value );
break;
case 'column-last_name':
$this->update_meta( $user->ID, 'last_name', $value );
break;
case 'column-nickname':
$this->update_meta( $user->ID, 'nickname', $value );
break;
case 'column-rich_editing':
$this->update_meta( $user->ID, 'rich_editing', $value );
break;
case 'column-user_description':
$this->update_meta( $user->ID, 'description', $value );
break;
// Save basic property such as title or description (data that is available in WP_Post)
default:
if ( ! empty( $editable['property'] ) ) {
$property = $editable['property'];
if ( isset( $user->{$property} ) ) {
wp_update_user( array(
'ID' => $user->ID,
$property => $value
) );
}
}
}
}
/**
* @see CACIE_Editable_Model
* @version 3.6
*/
public function get_column_editability_value( $column, $id ) {
$value = parent::get_column_editability_value( $column, $id );
if ( $column->properties->type == 'username' ) {
$user = get_user_by( 'id', $id );
return $user->user_login;
}
return $value;
}
}