J'écris un plugin appelé 'Featured Releases' pour un client. L'utilisateur remplit un court formulaire dans la zone d'administration qui insère du texte et un identifiant d'image dans la base de données wordpress via $ wpdb-> insert. Cela fonctionne bien sur ma machine de développement, mais sur le serveur de production (qui compte plus de 500 publications de toutes sortes, principalement des images), la valeur de l'identifiant de l'image est modifiée et devient 127, quoi que je fasse. 127 est l'identifiant d'un article, mais ce n'est pas une image et certainement pas l'identifiant qui a été transmis à partir du formulaire.
L'image est téléchargée via le programme de téléchargement de média wordpress natif. L'identifiant de publication de l'image (de la table wp_posts) est transmis à une entrée masquée du formulaire. Lors de l'envoi, cette fonction gère les données $ _POST:
function fr_add_album() {
global $wpdb;
if ( isset($_POST) && (count($_POST) > 0) ) {
check_admin_referer('featured-releases-add_album');
$table_name = $wpdb->prefix . 'featured_releases';
$desired_keys = array('fr_band', 'fr_album', 'fr_album_description', 'fr_image_id', 'fr_shop_url');
$data = array();
foreach( $desired_keys as $key ) {
// Define and sanatize data
if ( isset($_POST["$key"]) ) {
$accepted_html = array('a' => array('href' => array(),
'title' => array()));
$data["$key"] = wp_kses($_POST["$key"], $accepted_html);
unset($_POST["$key"]);
} else {
$data["$key"] = '';
}
}
// Sanitize the shop url
if ( isset($data['fr_shop_url']) ) {
$data['fr_shop_url'] = esc_url($data['fr_shop_url']);
}
$data['fr_modified'] = date('Y-m-d h:i:sa');
error_log($data['fr_image_id']); // This returns the correct value!
$wpdb->insert($table_name, $data, array('%s','%s', '%s', '%d', '%s'));
// After the insert, the fr_image_id column always reads "127"
}
}
La chose folle est qu’il ya quelques images qui sont correctement postées . Ce sont les premières images que j'ai téléchargées lorsque j'ai créé l'installation de wordpress. Toute autre image de toute autre date, y compris toute nouvelle image que j'ai téléchargée, est enregistrée en tant que 127 dans la base de données. Toutes les images ont les mêmes propriétaires et les mêmes autorisations. Je ne vois pas non plus de différence dans wp_posts entre les nouvelles images et les anciennes. Des idées? Je suis en train de mourir. Merci de votre aide!
Excellent conseil Rarst! Le résultat de $ wpdb-> requêtes était exactement ce qu'il devrait être:
"INSERT INTO `wp_featured_releases` (`fr_band`,`fr_album`,`fr_album_description`,`fr_image_id`,`fr_shop_url`,`fr_modified`) VALUES ('','','','504','','2011-01-14 10:49:58pm')"
504 est l'id correct pour l'image, mais la valeur dans la table est toujours 127.
Ma dernière pensée est que mes compétences en mysql m'ont échoué. Les images dont l'ID est inférieur à 127 fonctionnent correctement, mais les valeurs supérieures à 127 sont remplacées par 127. Le type de colonne contenant fr_image_id est tinyint (9), qui devrait pouvoir contenir n'importe quelle valeur jusqu'à 9999999999, non? Sinon, je pense avoir trouvé ma réponse. Je vais essayer de le changer et voir.
Cryptique en effet. Quelque chose ne va pas seulement dans la production et que sur une brève étape de l'exécution de la requête (qui est utilisé de manière extensive et théoriquement assez fiable) ...
Aviez-vous essayé de vérifier la validité de la requête SQL générée? ( Enregistrer les requêtes pour analyse ). J'essayais tout d'abord d'essayer de voir ce qui est vraiment envoyé à la base de données et si cela semble aller si la même requête fonctionne correctement lorsqu'elle est effectuée manuellement avec PHPMyAdmin ou un autre outil.