web-dev-qa-db-fra.com

Champs personnalisés pour enregistrer plusieurs valeurs

J'ajoute une méta-boîte personnalisée. Jquery me permet d'y créer plusieurs champs personnalisés avec une clé "test". Il peut y avoir un ou plusieurs champs personnalisés, mais la clé n’est que "test". Je peux également supprimer des valeurs de clé, qui ne sont plus nécessaires. Le problème est que je ne peux pas enregistrer plusieurs valeurs du champ personnalisé avec la même clé. Seule la dernière valeur est enregistrée dans tous les champs. Aidez-moi, s'il vous plaît, à prendre une décision!

<?php add_action( 'add_meta_boxes', 'add_test_meta_box' );  
    function add_test_meta_box()  
    {  
        add_meta_box( 'test_meta_box', 'TEST PARAM', 'add_test_meta', 'post', 'normal', 'high' );      
    }  

    function add_test_meta( $post )  
    {  
        // Grab our data to fill out the meta boxes (if it's there)  
        $test = get_post_meta( $post->ID, 'test', true ); 

        // Add a nonce field 
        wp_nonce_field( 'save_test_meta', 'test_meta' ); 
        ?> 

        <div id="myfor">
            <p> 
                <label>Param 1 key "test" </label><br >
                <input type="text" name="test" value="<?php echo esc_attr( $test ); ?>"  size="60" /><span>Delete</span>
            </p> 
        </div>

        <input type="button" value="Добавить" id="addnew">

        <?php 
    } 

    add_action( 'save_post', 'test_meta_save' ); 
    function test_meta_save( $id ) 
    { 
        // No auto saves 
        if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;  

        // Check our nonce 
        if( !isset( $_POST['test_meta'] ) || !wp_verify_nonce( $_POST['test_meta'], 'save_test_meta' ) ) return; 

        // make sure the current user can edit the post 
        if( !current_user_can( 'edit_post' ) ) return; 

        // strip all html tags and esc attributes here 
        if( isset( $_POST['test'] ) ) 
            update_post_meta( $id, 'test', esc_attr( strip_tags( $_POST['test'] ) ) );   
    }  

    add_action('admin_head', 'my_add_input');


    function my_add_input() { ?>
      <script>
      // add live metod 
      jQuery.fn.live = function (types, data, fn) {
        jQuery(this.context).on(types,this.selector,data,fn);
        return this;
    };

    // add new input
      (function($){ 
          $(function(){ 

            var num = 2;


            $('#addnew').click(function(){
                $('#myfor').append('<p><label>Param  '+ num +' key "test" </label><br ><input type="text" name="test" value=""  size="60" /> <span>Delete</span></p>');
                num ++;
            });

            $('span').live( 'click' , function(){       
                $(this).parent('p').remove();
            });     

        });  
    })(jQuery)  
      </script>

    <?php } ?> 
2
Maxim Popov
  1. Commencez par dd ce code [] à la fin du nom de votre champ de formulaire. Donc, le nom de votre champ sera "test []".

    Exemple:

    <input type="text" name="test[]" value=""  size="60" />
    
  2. Utilisez cette méthode pour enregistrer la valeur:

    $old = get_post_meta($post_id, 'your_meta_key', true);
    $newtest = array();
    $test = $_POST['test'];
    $count = count( $test );
    
    for ( $i = 0; $i < $count; $i++ ) {
        if ( $test[$i] != '' ) {
            $newtest[$i]['test'] = stripslashes( strip_tags( $test[$i] ) );
        }
    }
    
    if ( !empty( $newtest ) && $newtest != $old ) {
        update_post_meta( $post_id, 'repeatable_fields', $newtest );
    } elseif ( empty($newtest) && $old ) {
        delete_post_meta( $post_id, 'repeatable_fields', $old );
    }
    
  3. Affichage de votre champ avec les valeurs enregistrées:

    $show_the_value = get_post_meta($post->ID, 'your_meta_key', true);
    if ($show_the_value) {
        foreach ($show_the_value as $value) { ?>
            <input type="text" name="test[]" value="<?php if($value['test'] != '') echo  $value['test']; ?>"  size="60" />
        <?php }
    }
    
2
KeepMove