web-dev-qa-db-fra.com

get_post_meta retourne bool (false)

Je teste et j'essaie de trouver où ça ne va pas, mais je suis coincé sur cette partie. get_post_meta () ne renvoie aucune de mes valeurs, testé avec un var_dump (get_post_meta (1)), il semble le renvoyer, mais lors de l'accès à cette clé var_dump (get_post_meta (1, 'key_name')) un bool (faux).

De plus, la méthode suivante ne fonctionne pas pour moi, var_dump (get_post_meta (1, 'key_name', true)); comme par défaut, il est faux, alors cochez cette case. Dans ma base de données, la clé 100% existe et a des valeurs, ainsi que l'ID qui envoie correctement cette clé.

<?php 
    var_dump(get_post_meta(1));                // array(4)
    var_dump(get_post_meta(1,'key_name');      // array(1){[0]=>bool(false)}
    var_dump(get_post_meta(1,'key_name',true); // bool(false)
?>

Est-ce qu'il y a quelque chose qui ne va pas avec WordPress à ce sujet ou est-ce que je manque quelque chose ici, j'ai un énorme stockage de données, cela pourrait-il être un problème pour WordPress? Utilisation de la dernière version de WordPress disponible en téléchargement sur wordpress.org.


Edit: Plus d'informations requises

Merci pour votre commentaire. J'utilise simplement add_post_meta () et update_post_meta (). Je ne comprends pas cela, je travaille avec cela tous les jours aussi, mais je n’ai jamais vu cela avant que cela se produise. Dans la partie admin, cela fonctionne sans aucun problème. le code:

<?php
    // $pID is 526660
    // Checked this with a diffrent var_dump
    var_dump(get_post_meta($pID));
    var_dump(get_post_meta($pID, 'agenda_postmeta'));
    var_dump(get_post_meta($pID, 'agenda_postmeta', true)); 
?>

Retourne

// First var_dump
array(4) {
  ["agenda_postmeta"]=>
  array(1) {
    [0]=>
    string(843) "(serialized data string, hide this for privacy reasons on my comment)"
  }
  ["agenda_date"]=>
  array(1) {
    [0]=>
    string(10) "2016-10-08"
  }
  ["agenda_location"]=>
  array(1) {
    [0]=>
    string(17) "Jaarbeurs Utrecht"
  }
  ["agenda_city"]=>
  array(1) {
    [0]=>
    string(7) "Utrecht"
  }
}

// Second var_dump
array(1) {
  [0]=>
  bool(false)
}

// Third var_dump
bool(false)

Edit: Informations supplémentaires ajouter/mettre à jour postmeta

Ci-dessous, le code utilisé pour enregistrer ceci dans ma base de données, cela fonctionne car la base de données a ses clés/valeurs.

 Database values by post_id 

// Check for update or add
if( $has_id != 0 )
{
    update_post_meta( $post_id, 'agenda_postmeta', $postmeta );
    update_post_meta( $post_id, 'agenda_date', date("Y-m-d", strtotime($_POST["party_date"])) );
    update_post_meta( $post_id, 'agenda_location', $_POST["party_location"] );
    update_post_meta( $post_id, 'agenda_city', $_POST["party_city"] );
}
else {
    // If no posted_id available insert post_meta
    add_post_meta( $post_id, 'agenda_postmeta', $postmeta );
    add_post_meta( $post_id, 'agenda_date', date("Y-m-d", strtotime($_POST["party_date"])) );
    add_post_meta( $post_id, 'agenda_location', $_POST["party_location"] );
    add_post_meta( $post_id, 'agenda_city', $_POST["party_city"] );
}
2
Erik Kraijenoord

Apparemment, les données sérialisées ont été corrompues, l'appel du champ par requête m'a généré cette erreur. WordPress ne renvoie pas d'erreur lorsque les données sérialisées sont corrompues, juste une valeur booléenne (false).

Résolu cela en insérant/mettant à jour les données sérialisées dans une base64_encode () et en l'appelant avec base64_decode (). Cela semble faire l'affaire et les données peuvent être rappelées à partir de la fonction.


A écrit une petite fonction pour moi

Peut-être qu'il y a quelqu'un avec le même problème, j'ai écrit cette petite fonction pour vérifier.

<?php
function wpgz_post_meta( $post_id, $meta_key="", $base64_decode=false )
{
    if( intval($post_id) )
    {
         $post_meta = get_post_meta( $post_id, $meta_key, true );
         $post_meta = $base64_decode !== false ? base64_decode($post_meta) : NULL;

         $post_meta = explode(PHP_EOL, $post_meta);
         $post_meta = unserialize($post_meta[0]);

         if( is_array($post_meta) )
         {
             return $post_meta; 
         }
         else {

             send_page_notice("danger", "Invalid format", "Returned value is not a valid array.");
         }
     }
     else {

         send_page_notice("danger", "Invalid input", "The first value for this function should be an integer number.");
    }
}
1
Erik Kraijenoord