web-dev-qa-db-fra.com

Comment editer la table mySQL wp_posts à partir du plugin php?

J'ai besoin de changer un plugin qui ajoute des entrées à la table wp_posts. Actuellement, il manque en ce sens qu'il ne peut pas cibler certaines (autres) colonnes spécifiques à un plugin. Je m'efforce d'éditer le plugin pour pouvoir changer ces colonnes également avec le plugin.

Comment pourrais-je généralement cibler cette table puis créer/modifier des entrées?

Je pense à quelque chose comme ce pseudo-code:

function editTable() {
    $table = getTable(wp_posts);
    $tableRow = table.row(1234);
    $tableRow.column(1234) = "new data entry";
}

Je suppose que cela est possible car le plug-in que j'espère changer modifie déjà la table wp_posts. Je me rends compte cependant que mon pseudo-code peut être très différent. Comment puis-je faire cela?

1
fredsbend

Je connais deux méthodes pour modifier la table wp_posts. Le premier concerne les fonctions wp_update_post() et wp_insert_post(). Il s’agit de fonctions WP typiques qui sont utilisées comme d’autres. Vous devez juste passer les paramètres corrects. Par exemple:

$my_post = array(
      'ID'           => $updatePostID, // User defined variable; the post id you want to update.
      'post_title'   => 'Update Title',
      'post_content' => 'Update Content', 
  );
// Update the post into the database
$post_id = wp_update_post( $my_post, true ); // Returns 0 if no error; returns post id if there was an error.

// Check if table was updated without error. For debugging. Remove from your code if it all works, before publishing.
if (is_wp_error($post_id)) {
    $errors = $post_id->get_error_messages();
    foreach ($errors as $error) {
        echo $error;
    }
}

Passez simplement un tableau avec les noms de champs prédéfinis aux fonctions pour qu'elles s'exécutent correctement. La fonction de mise à jour est destinée aux mises à jour, bien sûr, et la fonction d'insertion crée de nouvelles entrées de table (lignes). Il y a cependant une limite. Ces deux fonctions ne fonctionneront que sur les champs prédéfinis WP. Donc, si votre table contient des champs personnalisés, vous devrez alors utiliser la classe $wpdb.

L'autre façon de mettre à jour vos tables mySQL à partir de WordPress consiste à utiliser directement la classe $wpdb. Cette classe est beaucoup plus étendue que les fonctions wp_update_post() et wp_insert_post(). La première différence est qu’il peut éditer beaucoup d’autres tables mySQL, pas seulement la table wp_posts. Il peut également éditer des champs non-WP. Par exemple:

global $wpdb; // This calls the use of the class. I actually do not think this is necessary, but I do it anyway.
$dbresult = $wpdb->update($wpdb->posts, // Returns 0 if no errors. Post ID if errors occurred. 
            // Notice posts instead of wp-posts. Prefixes are not necessary with this class.
     ['post_title' => 'Update Title', 
      'post_content' => 'Update Content', 
      'custom_field' => $customField, ], // User defined table column and variable.
     ['ID' => $updatePostID, ]); // User defined variable; the post id.
if (false === $dbresult) {
    echo 'An error occurred while updating...'; 
    $errors = $post_id->get_error_messages();
}

Je ne connais pas très bien l’une ou l’autre de ces options, mais il semble y avoir une énorme différence dans l’ampleur des fonctionnalités. Vous devrez donc peut-être tenir compte de certaines considérations avant d’utiliser l’une sur l’autre. J'ai posé une question à cette fin: Qu'est-ce que wp_update_post () fait que la classe $ wpdb ne le fait pas? One répondre dit:

Les inconvénients de $wpdb sont que vous devez connaître SQL et vous devez être conscient de la désinfection normale des données et du moment où vous devez utiliser prepare() et des fonctions qui préparent déjà votre déclaration, ce qui ne constitue guère un inconvénient. La classe $wpdb est par nature plus puissante que les fonctions par défaut de WordPress car vous avez accès à all les données, personnalisées ou non, en supposant que vous connaissiez le bon code SQL à obtenir, à modifier. , ou l'enlever.

TL; DR$wpdb est plus puissant mais moins convivial et indulgent.

Cela a du sens pour moi. En gros, ne jouez pas avec $ wpdb sauf si vous savez ce que vous faites ou devez absolument.

0
fredsbend