web-dev-qa-db-fra.com

Configurer WordPress pour lire à partir de la base de données uniquement, ne jamais écrire

Comment puis-je configurer WordPress en lecture seule?

J'ai une configuration qui met à l'échelle les instances d'esclaves avec un accès en base de données en lecture seule, mais je vois beaucoup de données de journal dans lesquelles WordPress tente toujours d'écrire dans la base de données.

update_{post_type}_metadata , set_transient , wpdb ... il serait idéal d’arrêter quoi que ce soit qui tenterait d’écrire. Je peux facilement vérifier si je suis sur une instance MASTER par rapport à une instance SLAVE afin de pouvoir modifier les hooks assez tôt.

Essayer de court-circuiter la fonction de métadonnées de mise à jour semble éventuellement éliminer un vecteur, mais je crains que le reste ne concerne la modification de WP Core.

add_filter ( 'update_post_metadata', '__return_false', 99 );

$result = update_post_meta( -1, 'test-key', 'test-value' );

echo $result;

Aucune suggestion?


HyperDB semble prometteur comme solution à plus long terme.

3
jgraup

WordPress ne fonctionne pas bien en mode lecture seule. Cela dépend de la base de données pour le cache et d'autres tâches.

Cependant, il existe plusieurs options si vous souhaitez continuer.

  1. Définissez les autorisations utilisateur de la base de données sur 'READ ONLY'
  2. Utilisez une fonction pour intercepter toutes les requêtes de base de données. Nous avons utilisé cela sur notre site de démonstration thématique pour empêcher db écrit.

Fonction à utiliser:

/**
 * Whitelist "SELECT" and "SHOW FULL COLUMNS" queries.
 */
function my_readonly_filter( $query ) {
  global $wpdb;

  if ( preg_match( '/^\s*select|show full columns\s+/i', $query ) ) {
    return $query;
  }

  // Return arbitrary query for everything else otherwise you get 'empty query' db errors.
  return "SELECT ID from $wpdb->posts LIMIT 1;";
}
add_filter( 'query', 'my_readonly_filter' );
6
cowgill