web-dev-qa-db-fra.com

Enregistrement d'un tableau dans un seul champ personnalisé

J'ai le tableau suivant que je veux stocker dans un seul champ personnalisé.

array("Accounting"=>"Peter", "Finance"=>"Ben", "Marketing"=>"Joe");

Je veux le stocker en le tapant dans un champ personnalisé dans wp-admin.

Ensuite, je veux récupérer ce champ personnalisé sous forme de tableau dans une page, avec quelque chose comme

$pos = get_post_meta($post_id, 'pos ', true);

et affichez le tableau avec:

foreach($pos  as $x => $x_value) {
    echo $x_value . " head " . $x;
    echo "<br>";
}

Mes questions sont:

  1. Comment enregistrer le tableau dans un seul champ personnalisé? Qu'est-ce que je dois taper exactement dans le champ personnalisé?

  2. Comment puis-je récupérer cette valeur de champ personnalisé sous forme de tableau dans un modèle wordpress?

Solution finale au problème merci à Ray:

  1. J'écris ce qui suit directement dans le champ personnalisé de l'administrateur de wp (ou utilise update_post_meta avec json_encode dans le modèle)

    {"Accounting":"Peter","Finance":"Ben","Marketing":"Joe"}
    
  2. Récupérer un tableau dans un champ personnalisé avec:

    $json_data = get_post_meta($post_id, "my_custom_meta_key", true);
    $arr_data = json_decode($json_data, true);
    
2
Philip

Vous pouvez json_encode() le rendre, ce qui en fera une chaîne que vous pourrez placer dans un champ personnalisé, puis vous assurer simplement que vous le json_decode() pour le ramener à un objet ou json_decode($data, true) pour le ramener sous forme de tableau

$arr = array("Accounting"=>"Peter", "Finance"=>"Ben", "Marketing"=>"Joe");
update_post_meta($post_id, "my_custom_meta_key", json_encode($arr));
$json_data = get_post_meta($post_id, "my_custom_meta_key", true); // true to ensure it comes back as a string and not an array
$arr_data = json_decode($json_data, true); // 2nd parameter == true so it comes back as an array();
4
Ray

Généralement, les champs personnalisés sont sauvegardés à partir de la saisie de formulaire. Si vous souhaitez enregistrer un tableau comme le vôtre, vous pouvez créer une métabox sur l'écran de modification post-édition.

Cette metabox devrait afficher une entrée avec le même nom, quelque chose comme ça

<input type="text" name="pos[Accounting]" value=""/>
<input type="text" name="pos[Finance]" value=""/>
<input type="text" name="pos[Marketing]" value=""/>

La façon dont vous proposez d’afficher semble bonne.

Vous pouvez trouver plus de détails pour afficher et sauvegarder des métaboxes avec add_meta_boxes action et add_meta_box()

j'espère que cela vous donne des indices!

0
Benoti

On dirait que vous voulez pouvoir entrer ces valeurs à partir de la metabox des champs personnalisés WordPress:

 enter image description here 

Pour ce faire, je voudrais utiliser un format personnalisé, puis le convertir lorsque la publication est enregistrée.

// This function converts "Accounting,Peter|Finance,Ben|Marketing,Joe" format
// to array("Accounting"=>"Peter", "Finance"=>"Ben", "Marketing"=>"Joe");
function smyles_convert_custom_format_to_array( $val ){

    $employee_data = array();

    // Create array with | as separator
    $parts = explode( '|', $val );

    if( ! empty( $parts ) ){

        // Loop through each one
        foreach( $parts as $part ){

            // Split again based on comma
            $part_array = explode( ',', $part );

            // As long as there is a value, let's add it to our employee array
            if( ! empty( $part_array[0] ) && ! empty( $part_array[1] ) ){

                // First value in array will be our key, second will be the value
                $employee_data[ $part_array[0] ] = $part_array[1];
            }

        }

    }

    return $employee_data;
}

Vous devez ensuite ajouter une action pour mettre à jour la méta après la conversion du format personnalisé avec la fonction ci-dessus:

// Add a custom action on save post so we can convert our custom format
add_action( 'save_post', 'smyles_save_post_format_custom_field', 99, 3 );
// This function will update the post meta with an array instead of using our custom format
function smyles_save_post_format_custom_field( $id, $post, $update ){

    $custom_field = 'employees';

    // Change `post` below to something else if using custom post type
    if( $post->post_type != 'post' ) {
        return;
    }

    // Only try to process if a value exists
    if( ! empty( $_POST[ $custom_field ] ) ){
        $value = smyles_convert_custom_format_to_array( $_POST[ $custom_field ] );
    } else {
        // Otherwise set $value to empty value, meaning custom field was deleted or has an empty value
        $value = array();
    }

    update_post_meta( $id, $custom_field, $value, true );

}

Lorsque vous voulez extraire ces valeurs, utilisez simplement ceci:

// Arrays are stored serialized, so let's get that first
$value = get_post_meta( $post_id, 'employees', true);

Voila! Profit!

0
sMyles