Создайте новую таблицу данных wp на основе таблицы wp_usermeta

#php #sql #wordpress

Вопрос:

Мне нужно скопировать определенные данные из wp_usermeta в новую таблицу, когда определенный плагин активируется на дочернем сайте в первый раз. До сих пор я могу заставить $admin_ids печатать, как ожидалось, но не знаю, как и могу ли я использовать эти значения в инструкции IN в SQL. До сих пор таблица не создавалась с использованием приведенных ниже методов.

Вопрос в том, как правильно написать этот SQL-запрос, чтобы при запуске функции создавалась новая таблица на основе таблицы wp_usermeta, в которой идентификаторы текущих администраторов блога равны идентификатору wp_usermeta.user_id.

Я не получаю никаких ошибок, предупреждений или уведомлений при запуске функции, wp просто останавливается навсегда.

Вот мой код.

 function create_blog_usermeta_table(){
 if(function_exists('other_plugin_function')){
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();

     // WP_User_Query arguments
        $args = array(
            'role' => 'Administrator', 
            'fields' => 'ID' 
        );

        // The User Query
        $user_query = new WP_User_Query( $args );

        // Get the results
        $admins = $user_query->get_results();
        
        //Extract and format admin ids from the results
        $admin_ids = wp_list_pluck( $admins, 'ID', 'ID');
        $admin_ids = implode( ',', $admin_ids );

        
    $usermeta_table = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}_usermeta AS
        SELECT *
        FROM wp_usermeta
        Where user_id IN ($admin_ids)";

    }

}
 

Комментарии:

1. Итак, что вы собираетесь делать с $usermeta_table

Ответ №1:

Это сработало.

  //Create blog usermeta table containing usermeta for the current blog's users.
function create_blog_usermeta_table(){

   
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();

        // WP_User_Query arguments
        $args = array(
            'role' => 'Administrator', 
            'fields' => 'ID' 
        );

        // The User Query
        $user_query = new WP_User_Query( $args );

        // Get the results
        $query = $user_query->get_results();
        $admin_ids = wp_list_pluck( $query, 'ID', 'ID');
        $admin_ids = implode(',', $admin_ids);
        
        // Create new usermeta table for the blog users.
        $usermeta_table = "
        CREATE TABLE IF NOT EXISTS {$wpdb->prefix}usermeta AS
        SELECT *
        FROM wp_usermeta
        Where user_id IN ($admin_ids)";

require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta( $usermeta_table );
    }
register_activation_hook( MY_PLUGIN_PATH . '/my-plugin.php', 'create_blog_usermeta_table' );
 

Ответ №2:

Предыдущее решение не копировало индексы. У этого есть.

  //Create blog usermeta table containing usermeta for the current blog's users.
function create_blog_usermeta_table(){
    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
        global $wpdb;
        
        $charset_collate = $wpdb->get_charset_collate();

     // WP_User_Query arguments
        $args = array(
            'role' => 'Administrator', 
            'fields' => 'ID' 
        );

        // The User Query
        $user_query = new WP_User_Query( $args );

        // Get the results
        $admins = $user_query->get_results();
        $user_ids = wp_list_pluck( $admins, 'ID', 'ID');
        $user_ids = implode(',', $user_ids);
        $new_table = $wpdb->prefix . 'usermeta';
        // Create new usermeta table for the blog users.
        $usermeta_table ="CREATE TABLE  `{$wpdb->prefix}usermeta` LIKE wp_usermeta;
  
        INSERT `{$wpdb->prefix}usermeta` SELECT * FROM wp_usermeta WHERE user_id IN ($user_ids);";

    dbDelta( $usermeta_table );
    maybe_create_table( $wpdb->prefix . 'usermeta', $usermeta_table );
    }