web-dev-qa-db-fra.com

Base de données WordPress Charset/Collate

Existe-t-il un moyen simple d’obtenir le jeu de caractères et le classement des tables de base de données dans WordPress sans recourir à des requêtes SQL?

4
Tom J Nowell

Il y a $wpdb->charset et $wpdb->collate. Je ne sais pas si ou quand une de ces valeurs pourrait être vide, il est donc préférable de se préparer à des valeurs vides…

De ma classe DB:

/**
 * Get table charset and collation.
 *
 * @since  2012.10.22
 * @return string
 */
protected static function get_wp_charset_collate() {

    global $wpdb;
    $charset_collate = '';

    if ( ! empty ( $wpdb->charset ) )
        $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";

    if ( ! empty ( $wpdb->collate ) )
        $charset_collate .= " COLLATE $wpdb->collate";

    return $charset_collate;
}

Utilisé pour créer une table comme celle-ci:

    global $wpdb;

    // encoding
    $charset_collate = self::get_wp_charset_collate();
    $table           = self::get_table_name();

    // the user could have just deleted the plugin without running the clean up.
    $sql = "CREATE TABLE IF NOT EXISTS $table (
        ID bigint unsigned NOT NULL auto_increment,
        event_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
        event_group tinytext,
        event_title text,
        PRIMARY KEY  (ID)
    ) $charset_collate;";


    // make dbDelta() available
    require_once ABSPATH . 'wp-admin/includes/upgrade.php';

    dbDelta( $sql );

Lié: Problème avec le jeu de caractères de blog UTF-7

5
fuxia

Le fichier wp-admin/includes/upgrade.php comprend wp-admin/includes/schema.php. Au sommet, déclarez globalement ( voir source ):

// Declare these as global in case schema.php is included from a function.
 global $wpdb, $wp_queries, $charset_collate;
...
$charset_collate = '';

if ( ! empty( $wpdb->charset ) )
    $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
if ( ! empty( $wpdb->collate ) )
    $charset_collate .= " COLLATE $wpdb->collate";

Vous pouvez donc suivre la réponse de @ Toscho et vérifier $wpdb. Ou, en utilisant l'exemple de Toscho:

global $wpdb, $charset_collate;
require_once ABSPATH . 'wp-admin/includes/upgrade.php';

$sql = "CREATE TABLE $table (
    ID bigint unsigned NOT NULL auto_increment,
    event_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    event_group tinytext,
    event_title text,
    PRIMARY KEY  (ID)
) $charset_collate;";

dbDelta( $sql );

Notez que le IF NOT EXISTS n'est pas requis car dbDelta() gère cela .

1
Stephen Harris