588 lines
18 KiB
PHP
588 lines
18 KiB
PHP
<?php
|
|
|
|
class ACUI_Helper{
|
|
private static $instance;
|
|
|
|
function __construct(){
|
|
}
|
|
|
|
private static function is_instantiated() {
|
|
if ( ! empty( self::$instance ) && ( self::$instance instanceof ACUI_Helper ) ) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private static function setup_instance() {
|
|
self::$instance = new ACUI_Helper;
|
|
}
|
|
|
|
static function instance() {
|
|
if ( self::is_instantiated() ) {
|
|
return self::$instance;
|
|
}
|
|
|
|
self::setup_instance();
|
|
|
|
return self::$instance;
|
|
}
|
|
|
|
function detect_delimiter( $file ) {
|
|
$delimiters = array( ';' => 0, ',' => 0, "\t" => 0, "|" => 0 );
|
|
|
|
$handle = @fopen( $file, "r" );
|
|
$firstLine = fgets( $handle );
|
|
fclose( $handle );
|
|
|
|
foreach( $delimiters as $delimiter => &$count ) {
|
|
$count = count( str_getcsv( $firstLine, $delimiter ) );
|
|
}
|
|
|
|
return array_search( max( $delimiters ), $delimiters );
|
|
}
|
|
|
|
function user_id_exists( $user_id ){
|
|
if ( get_userdata( $user_id ) === false )
|
|
return false;
|
|
else
|
|
return true;
|
|
}
|
|
|
|
function get_roles_by_user_id( $user_id ){
|
|
$roles = array();
|
|
$user = new WP_User( $user_id );
|
|
|
|
if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
|
|
foreach ( $user->roles as $role )
|
|
$roles[] = $role;
|
|
}
|
|
|
|
return $roles;
|
|
}
|
|
|
|
static function get_editable_roles( $include_no_role = true ){
|
|
global $wp_roles;
|
|
|
|
$all_roles = $wp_roles->roles;
|
|
$editable_roles = apply_filters('editable_roles', $all_roles);
|
|
$list_editable_roles = array();
|
|
|
|
foreach ($editable_roles as $key => $editable_role)
|
|
$list_editable_roles[$key] = translate_user_role( $editable_role["name"] );
|
|
|
|
if( $include_no_role )
|
|
$list_editable_roles['no_role'] = __( 'No role', 'import-users-from-csv-with-meta' );
|
|
|
|
return $list_editable_roles;
|
|
}
|
|
|
|
static function get_csv_delimiters_titles(){
|
|
return array(
|
|
'COMMA' => __( 'Comma', 'import-users-from-csv-with-meta' ),
|
|
'COLON' => __( 'Colon', 'import-users-from-csv-with-meta' ),
|
|
'SEMICOLON' => __( 'Semicolon', 'import-users-from-csv-with-meta' ),
|
|
'TAB' => __( 'Tab', 'import-users-from-csv-with-meta' ),
|
|
);
|
|
}
|
|
|
|
static function get_list_users_with_display_name(){
|
|
$blogusers = get_users( array( 'fields' => array( 'ID', 'display_name' ) ) );
|
|
$result = array();
|
|
|
|
foreach ( $blogusers as $bloguser )
|
|
$result[ $bloguser->ID ] = $bloguser->display_name;
|
|
|
|
return $result;
|
|
}
|
|
|
|
static function get_loaded_periods(){
|
|
$loaded_periods = wp_get_schedules();
|
|
$result = array();
|
|
|
|
foreach ( $loaded_periods as $key => $value )
|
|
$result[ $key ] = $value['display'];
|
|
|
|
return $result;
|
|
}
|
|
|
|
function get_seconds_by_period( $period ){
|
|
$loaded_periods = wp_get_schedules();
|
|
return isset( $loaded_periods[ $period ] ) ? $loaded_periods[ $period ]['interval'] : 0;
|
|
}
|
|
|
|
static function get_errors_by_row( $errors, $row, $type = 'error' ){
|
|
$errors_found = array();
|
|
|
|
foreach( $errors as $error ){
|
|
if( $error['row'] == $row && ( $error['type'] == $type || 'any' == $type ) ){
|
|
$errors_found[] = $error['message'];
|
|
}
|
|
}
|
|
|
|
return $errors_found;
|
|
}
|
|
|
|
function string_conversion( $string ){
|
|
$use_mb = function_exists( 'mb_convert_encoding' );
|
|
if ( $use_mb ) {
|
|
$encoding = mb_detect_encoding( $string, mb_detect_order(), true );
|
|
if ( $encoding ) {
|
|
$string = mb_convert_encoding( $string, 'UTF-8', $encoding );
|
|
} else {
|
|
$string = mb_convert_encoding( $string, 'UTF-8', 'UTF-8' );
|
|
}
|
|
} else {
|
|
$string = wp_check_invalid_utf8( $string, true );
|
|
}
|
|
|
|
return $string;
|
|
}
|
|
|
|
function get_wp_users_fields(){
|
|
return array( "id", "user_email", "user_nicename", "user_url", "display_name", "nickname", "first_name", "last_name", "description", "jabber", "aim", "yim", "user_registered", "password", "user_pass", "locale", "show_admin_bar_front", "user_login" );
|
|
}
|
|
|
|
function get_restricted_fields(){
|
|
$wp_users_fields = $this->get_wp_users_fields();
|
|
$wp_min_fields = array( "Username", "Email", "role" );
|
|
$acui_restricted_fields = array_merge( $wp_users_fields, $wp_min_fields );
|
|
|
|
return apply_filters( 'acui_restricted_fields', $acui_restricted_fields );
|
|
}
|
|
|
|
function get_not_meta_fields(){
|
|
return apply_filters( 'acui_not_meta_fields', array() );
|
|
}
|
|
|
|
function get_random_unique_username( $prefix = '' ){
|
|
do {
|
|
$rnd_str = sprintf("%06d", mt_rand(1, 999999));
|
|
} while( username_exists( $prefix . $rnd_str ) );
|
|
|
|
return $prefix . $rnd_str;
|
|
}
|
|
|
|
function array_one_dimension($array) {
|
|
$one_dimension = true;
|
|
|
|
array_walk_recursive($array, function ($value) use (&$one_dimension) {
|
|
if( is_array( $value ) ) {
|
|
$one_dimension = false;
|
|
}
|
|
});
|
|
|
|
return $one_dimension;
|
|
}
|
|
|
|
function array_correlative_index( $array ) {
|
|
if( !is_array( $array ) ) {
|
|
return false;
|
|
}
|
|
|
|
$expectedKey = 0;
|
|
|
|
foreach( $array as $key => $value ) {
|
|
if ($key !== $expectedKey) {
|
|
return false;
|
|
}
|
|
$expectedKey++;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
function array_contains_wp_error( $array ) {
|
|
foreach( $array as $key => $value ){
|
|
if( is_wp_error( $value ) )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function new_error( $row, $message = '', $type = 'error' ){
|
|
global $errors_totals;
|
|
|
|
switch( $type ){
|
|
case 'error':
|
|
$errors_totals['errors']++;
|
|
break;
|
|
|
|
case 'warning':
|
|
$errors_totals['warnings']++;
|
|
break;
|
|
|
|
case 'notice':
|
|
$errors_totals['notices']++;
|
|
break;
|
|
}
|
|
return array( 'row' => $row, 'message' => $message, 'type' => $type );
|
|
}
|
|
|
|
function maybe_update_email( $user_id, $email, $password, $update_emails_existing_users, $original_email ){
|
|
$user_object = get_user_by( 'id', $user_id );
|
|
|
|
if( $user_object->user_email == $email || ( apply_filters( 'acui_allow_no_email', false ) && empty( $original_email ) ) )
|
|
return $user_id;
|
|
|
|
switch( $update_emails_existing_users ){
|
|
case 'yes':
|
|
$user_id = wp_update_user( array( 'ID' => $user_id, 'user_email' => $email ) );
|
|
break;
|
|
|
|
case 'no':
|
|
$user_id = 0;
|
|
break;
|
|
|
|
case 'create':
|
|
$user_id = wp_insert_user( array(
|
|
'user_login' => $this->get_random_unique_username( 'duplicated_username_' ),
|
|
'user_email' => $email,
|
|
'user_pass' => $password
|
|
) );
|
|
break;
|
|
}
|
|
|
|
return $user_id;
|
|
}
|
|
|
|
static function get_attachment_id_by_url( $url ) {
|
|
$wp_upload_dir = wp_upload_dir();
|
|
$dir = set_url_scheme( trailingslashit( $wp_upload_dir['baseurl'] ), 'relative' );
|
|
|
|
if( !is_string( $url ) )
|
|
return false;
|
|
|
|
if ( false !== strpos( $url, $dir ) ) {
|
|
$file = basename( $url );
|
|
|
|
$query_args = array(
|
|
'post_type' => 'attachment',
|
|
'post_status' => 'inherit',
|
|
'fields' => 'ids',
|
|
'meta_query' => array(
|
|
array(
|
|
'key' => '_wp_attachment_metadata',
|
|
'compare' => 'LIKE',
|
|
'value' => $file,
|
|
),
|
|
),
|
|
);
|
|
|
|
$query = new WP_Query( $query_args );
|
|
|
|
if ( $query->have_posts() ) {
|
|
foreach ( $query->posts as $attachment_id ) {
|
|
$meta = wp_get_attachment_metadata( $attachment_id );
|
|
$original_file = basename( $meta['file'] );
|
|
$cropped_files = wp_list_pluck( $meta['sizes'], 'file' );
|
|
|
|
if ( $original_file === $file || in_array( $file, $cropped_files ) ) {
|
|
return (int) $attachment_id;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
static function get_post_id_by_slug( $slug ){
|
|
global $wpdb;
|
|
|
|
$page_path = rawurlencode( urldecode( $slug ) );
|
|
$page_path = str_replace( '%2F', '/', $page_path );
|
|
$page_path = str_replace( '%20', ' ', $page_path );
|
|
$parts = explode( '/', trim( $page_path, '/' ) );
|
|
$parts = array_map( 'sanitize_title_for_query', $parts );
|
|
$escaped_parts = esc_sql( $parts );
|
|
|
|
$in_string = "'" . implode( "','", $escaped_parts ) . "'";
|
|
|
|
$pages = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent, post_type FROM $wpdb->posts WHERE post_name IN (%s)", $in_string ), OBJECT_K );
|
|
$revparts = array_reverse( $parts );
|
|
|
|
$foundid = 0;
|
|
|
|
foreach ( (array) $pages as $page ) {
|
|
if ( $page->post_name == $revparts[0] ) {
|
|
$count = 0;
|
|
$p = $page;
|
|
|
|
while ( 0 != $p->post_parent && isset( $pages[ $p->post_parent ] ) ) {
|
|
$count++;
|
|
$parent = $pages[ $p->post_parent ];
|
|
if ( ! isset( $revparts[ $count ] ) || $parent->post_name != $revparts[ $count ] ) {
|
|
break;
|
|
}
|
|
$p = $parent;
|
|
}
|
|
|
|
if ( 0 == $p->post_parent && count( $revparts ) == $count + 1 && $p->post_name == $revparts[ $count ] ) {
|
|
$foundid = $page->ID;
|
|
if ( $page->post_type == $p->post_type ) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $foundid;
|
|
}
|
|
|
|
function print_table_header_footer( $headers ){
|
|
?>
|
|
<h3><?php echo apply_filters( 'acui_log_inserting_updating_data_title', __( 'Inserting and updating data', 'import-users-from-csv-with-meta' ) ); ?></h3>
|
|
<table id="acui_results">
|
|
<thead>
|
|
<tr>
|
|
<th><?php _e( 'Row', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<?php foreach( $headers as $element ):
|
|
echo "<th>" . esc_html( $element ) . "</th>";
|
|
endforeach; ?>
|
|
<?php do_action( 'acui_header_table_extra_rows' ); ?>
|
|
</tr>
|
|
</thead>
|
|
<tfoot>
|
|
<tr>
|
|
<th><?php _e( 'Row', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<?php foreach( $headers as $element ):
|
|
echo "<th>" . esc_html( $element ) . "</th>";
|
|
endforeach; ?>
|
|
<?php do_action( 'acui_header_table_extra_rows' ); ?>
|
|
</tr>
|
|
</tfoot>
|
|
<tbody>
|
|
<?php
|
|
}
|
|
|
|
function print_table_end(){
|
|
?>
|
|
</tbody>
|
|
</table>
|
|
<?php
|
|
}
|
|
|
|
function print_row_imported( $row, $data, $errors ){
|
|
$styles = "";
|
|
|
|
if( !empty( ACUI_Helper::get_errors_by_row( $errors, $row, 'any' ) ) )
|
|
$styles = "background-color:red; color:white;";
|
|
|
|
echo "<tr style='$styles' ><td>" . ($row - 1) . "</td>";
|
|
foreach ( $data as $element ){
|
|
if( is_wp_error( $element ) )
|
|
$element = $element->get_error_message();
|
|
elseif( is_object( $element ) ){
|
|
$element = serialize( $element );
|
|
}
|
|
elseif( is_array( $element ) ){
|
|
$element_string = '';
|
|
$i = 0;
|
|
|
|
foreach( $element as $it => $el ){
|
|
if( is_wp_error( $el ) )
|
|
$element_string .= $el->get_error_message();
|
|
elseif( is_array( $el ) || is_object( $el ) )
|
|
$element_string .= serialize( $el );
|
|
elseif( !is_int( $it ) )
|
|
$element_string .= $it . "=>" . $el;
|
|
else
|
|
$element_string .= $el;
|
|
|
|
if(++$i !== count( $element ) ){
|
|
$element_string .= ',';
|
|
}
|
|
}
|
|
|
|
$element = $element_string;
|
|
}
|
|
|
|
$element = esc_html( $element );
|
|
echo "<td>$element</td>";
|
|
}
|
|
|
|
echo "</tr>\n";
|
|
|
|
flush();
|
|
}
|
|
|
|
function print_errors( $errors ){
|
|
if( empty( $errors ) )
|
|
return;
|
|
?>
|
|
<h3><?php _e( 'Errors, warnings and notices', 'import-users-from-csv-with-meta' ); ?></h3>
|
|
<table id="acui_errors">
|
|
<thead>
|
|
<tr>
|
|
<th><?php _e( 'Row', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<th><?php _e( 'Details', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<th><?php _e( 'Type', 'import-users-from-csv-with-meta' ); ?></th>
|
|
</tr>
|
|
</thead>
|
|
<tfoot>
|
|
<tr>
|
|
<th><?php _e( 'Row', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<th><?php _e( 'Details', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<th><?php _e( 'Type', 'import-users-from-csv-with-meta' ); ?></th>
|
|
</tr>
|
|
</tfoot>
|
|
<tbody>
|
|
<?php foreach( $errors as $error ): ?>
|
|
<tr>
|
|
<td><?php echo $error['row']; ?></td>
|
|
<td><?php echo esc_html( $error['message'] ); ?></td>
|
|
<td><?php echo $error['type']; ?></td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
<?php
|
|
}
|
|
|
|
function print_results( $results, $errors ){
|
|
?>
|
|
<h3><?php _e( 'Results', 'import-users-from-csv-with-meta' ); ?></h3>
|
|
<table id="acui_results">
|
|
<tbody>
|
|
<tr>
|
|
<th><?php _e( 'Users processed', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<td><?php echo $results['created'] + $results['updated']; ?></td>
|
|
</tr>
|
|
<tr>
|
|
<th><?php _e( 'Users created', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<td><?php echo $results['created']; ?></td>
|
|
</tr>
|
|
<tr>
|
|
<th><?php _e( 'Users updated', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<td><?php echo $results['updated']; ?></td>
|
|
</tr>
|
|
<tr>
|
|
<th><?php _e( 'Users deleted', 'import-users-from-csv-with-meta' ); ?></th>
|
|
<td><?php echo $results['deleted']; ?></td>
|
|
</tr>
|
|
<tr>
|
|
<th><?php _e( 'Errors, warnings and notices found', 'import-users-from-csv-with-meta' ); ?></td>
|
|
<td><?php echo count( $errors ); ?></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<?php
|
|
}
|
|
|
|
function print_end_of_process(){
|
|
?>
|
|
<br/>
|
|
<p><?php printf( __( 'Process finished you can go <a href="%s">here to see results</a> or you can do <a href="%s">a new import</a>.', 'import-users-from-csv-with-meta' ), get_admin_url( null, 'users.php' ), get_admin_url( null, 'tools.php?page=acui&tab=homepage' ) ); ?></p>
|
|
<?php
|
|
}
|
|
|
|
function execute_datatable(){
|
|
?>
|
|
<script>
|
|
jQuery( document ).ready( function( $ ){
|
|
$( '#acui_results,#acui_errors' ).DataTable({
|
|
"scrollX": true,
|
|
});
|
|
} )
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
function basic_css(){
|
|
?>
|
|
<style type="text/css">
|
|
.wrap{
|
|
overflow-x:auto!important;
|
|
}
|
|
|
|
.wrap table{
|
|
min-width:800px!important;
|
|
}
|
|
|
|
.wrap table th,
|
|
.wrap table td{
|
|
width:200px!important;
|
|
}
|
|
</style>
|
|
<?php
|
|
}
|
|
|
|
static function get_array_from_cell( $value ){
|
|
if( strpos( $value, "=>" ) === false )
|
|
return explode( "::", $value );
|
|
|
|
$array_prepared = array();
|
|
|
|
foreach( explode( "::", $value ) as $data ){
|
|
$key_value = explode( "=>", $data );
|
|
$array_prepared[ $key_value[0] ] = $key_value[1];
|
|
}
|
|
|
|
return $array_prepared;
|
|
}
|
|
|
|
static function get_value_from_row( $key, $headers, $row, $user_id = 0 ){
|
|
$pos = array_search( $key, $headers );
|
|
|
|
if( $pos === false ){
|
|
return ( $user_id == 0 ) ? false : get_user_meta( $user_id, $key, true );
|
|
}
|
|
|
|
return $row[ $pos ];
|
|
}
|
|
|
|
static function show_meta( $user_id, $meta_key ){
|
|
$user_meta = get_user_meta( $user_id, $meta_key, true );
|
|
return is_array( $user_meta ) ? var_export( $user_meta, true ) : $user_meta;
|
|
}
|
|
|
|
function maybe_disable_wordpress_core_emails(){
|
|
if( !get_option('acui_automatic_wordpress_email') ){
|
|
add_filter( 'send_email_change_email', function() { return false; }, PHP_INT_MAX );
|
|
add_filter( 'send_password_change_email', function() { return false; }, PHP_INT_MAX );
|
|
}
|
|
}
|
|
|
|
function maybe_enable_wordpress_core_emails(){
|
|
if( !get_option('acui_automatic_wordpress_email') ){
|
|
remove_filter( 'send_email_change_email', function() { return false; }, 999 );
|
|
remove_filter( 'send_password_change_email', function() { return false; }, 999 );
|
|
}
|
|
}
|
|
|
|
// notices
|
|
static function get_notices(){
|
|
$notices = get_transient( 'acui_notices' );
|
|
delete_transient( 'acui_notices' );
|
|
return is_array( $notices ) ? $notices : array();
|
|
}
|
|
|
|
static function add_notice( $notice ){
|
|
$notices = self::get_notices();
|
|
$notices[] = $notice;
|
|
set_transient( 'acui_notices', $notices, 120 );
|
|
}
|
|
|
|
function get_notice(){
|
|
$notices = self::get_notices();
|
|
|
|
if( count( $notices ) == 0 )
|
|
return false;
|
|
|
|
$return = '';
|
|
foreach( $notices as $key => $notice ){
|
|
$return = $notice;
|
|
unset( $notices[ $key ] );
|
|
set_transient( 'acui_notices', $notices );
|
|
return $return;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function ACUIHelper(){
|
|
return ACUI_Helper::instance();
|
|
}
|