Soporte » Guías – Resolución de problemas » Undefined index en campos de los tipos personalizados

  • Buenos días a tod@s,
    He creado un tipo personalizado, lo instalo en mi servidor, y cuando intento crear un nuevo contenido de este tipo, me da el siguiente error:

    «Undefined index: _marca in /storage/ssd5/219/4304219/public_html/wp-content/themes/Prueba/functions.php on line «

    El tipo personalizado, que he creado es el siguiente:

    function articulo() {
    	global $
    	// Noncename necesario para verificar de dónde vienen los datos
       echo '<input type="hidden" name="articulometa_noncename" id="articulometa_noncename" value="'.wp_create_nonce( plugin_basename(__FILE__) ) . '" />';
       
       // Obtenemos los atributos del artículo si estuvieran guardados, con get_post_meta y el nombre del atributo
       $marca = get_post_meta($post->ID, '_marca', true);
       $precio = get_post_meta($post->ID, '_precio', true);
       $talla = get_post_meta($post->ID, '_talla', true);
    
       // Mostramos los campos de texto donde introduciremos los atributos
       echo '<p>Marca</p>';
       echo '<input type="text" name="_marca" value="' . $marca . '" class="widefat" />';
       echo '<p>Precio</p>';
       echo '<input type="text" name="_precio" value="' . $precio . '" class="widefat" />';
       echo '<p>Talla</p>';
       echo '<input type="text" name="_talla" value="' . $talla . '" class="widefat" />';
    }
    
    Y el error, me da en el metodo de guardar:
    
    function save_articulos_meta($post_id, $post) {
      // Comprobación de seguridad para que no se acceda desde otros sitios
      if ($_POST && !wp_verify_nonce($_POST['articulometa_noncename'], __FILE__)) {
        return $post->ID;
      }
       
      // Comprobación de que el usuario actual puede editar
      if ( !current_user_can( 'edit_post', $post->ID )) {
        return $post->ID; 
      }
         
      // Obtenemos los atributos guardados en POST cuando guardamos nuestra página de artículo	
      $articulos_meta['_marca'] = $_POST['_marca']; // <-- AQUI
      $articulos_meta['_precio'] = $_POST['_precio']; // <-- AQUI
      $articulos_meta['_talla'] = $_POST['_talla']; // <-- AQUI
    	
      // Guardamos los valores de los atributos como campos personalizados
      foreach ($articulos_meta as $key => $value) {		
        // No guardamos si el post es una revisión
        if ($post->post_type == 'revision') {
          return;
        } 
    		
        if (get_post_meta($post->ID, $key, FALSE)) {
          // Si el atributo ya existía, lo actualizamos
          update_post_meta($post->ID, $key, $value);
        } else {
          // Si no existía, lo añadimos nuevo
          add_post_meta($post->ID, $key, $value);
        }
    		
        // Si el valor está en blanco, eliminamos el atributo
        if (!$value) {
          delete_post_meta($post->ID, $key);
        }
      }
    }
    • Este debate fue modificado hace 2 años, 7 meses por Fernando Tellado. Razón: Etiquetado del código
Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)
  • Hola,

    No podemos ver bien el codigo ya que no usastes la etiqueta code
    Independientemente de eso, el mismo error te dice que pasa, por algun motivo no esta definido _marca.

    Iniciador del debate asego

    (@asego)

    Hola kallokoo, tienes razon. Aquí pongo el codigo correcto.

    function articulo() {
    global $
    // Noncename necesario para verificar de dónde vienen los datos
    echo ‘<input type=”hidden” name=”articulometa_noncename” id=”articulometa_noncename” value=”‘.wp_create_nonce( plugin_basename(__FILE__) ) . ‘” />’;
    
    // Obtenemos los atributos del artículo si estuvieran guardados, con get_post_meta y el nombre del atributo
    $marca = get_post_meta($post->ID, ‘_marca’, true);
    $precio = get_post_meta($post->ID, ‘_precio’, true);
    $talla = get_post_meta($post->ID, ‘_talla’, true);
    
    // Mostramos los campos de texto donde introduciremos los atributos
    echo ‘<p>Marca</p>’;
    echo ‘<input type=”text” name=”_marca” value=”‘ . $marca . ‘” class=”widefat” />’;
    echo ‘<p>Precio</p>’;
    echo ‘<input type=”text” name=”_precio” value=”‘ . $precio . ‘” class=”widefat” />’;
    echo ‘<p>Talla</p>’;
    echo ‘<input type=”text” name=”_talla” value=”‘ . $talla . ‘” class=”widefat” />’;
    }
    function save_articulos_meta($post_id, $post) {
    // Comprobación de seguridad para que no se acceda desde otros sitios
    if ($_POST && !wp_verify_nonce($_POST[‘articulometa_noncename’], __FILE__)) {
    return $post->ID;
    }
    
    // Comprobación de que el usuario actual puede editar
    if ( !current_user_can( ‘edit_post’, $post->ID )) {
    return $post->ID;
    }
    
    // Obtenemos los atributos guardados en POST cuando guardamos nuestra página de artículo
    $articulos_meta[‘_marca’] = $_POST[‘_marca’]; // <– AQUI
    $articulos_meta[‘_precio’] = $_POST[‘_precio’]; // <– AQUI
    $articulos_meta[‘_talla’] = $_POST[‘_talla’]; // <– AQUI
    
    // Guardamos los valores de los atributos como campos personalizados
    foreach ($articulos_meta as $key => $value) {
    // No guardamos si el post es una revisión
    if ($post->post_type == ‘revision’) {
    return;
    }
    
    if (get_post_meta($post->ID, $key, FALSE)) {
    // Si el atributo ya existía, lo actualizamos
    update_post_meta($post->ID, $key, $value);
    } else {
    // Si no existía, lo añadimos nuevo
    add_post_meta($post->ID, $key, $value);
    }
    
    // Si el valor está en blanco, eliminamos el atributo
    if (!$value) {
    delete_post_meta($post->ID, $key);
    }
    }
    }

    El problema es que es un input, con el name y el id iguales; y cuando intento recuperarlo, me falla

    Moderador LGrusin

    (@lgrusin)

    Este código no te ha salido bien, las comillas están todas cambiadas.

    ¿Qué es global $ ?

    get_post_meta debe usarse dentro del Loop, si no es así tendrás que usar
    get_post_meta(get_the_ID(), '_marca', true);

    Aquí tienes más info
    https://codex.wordpress.org/Custom_Fields

    • Esta respuesta fue modificada hace 2 años, 7 meses por LGrusin.
Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)
  • El debate ‘Undefined index en campos de los tipos personalizados’ está cerrado a nuevas respuestas.