WP inserta la función PHP posterior y los campos personalizados

26

La función de WordPress se usa para enviar datos mediante programación. Campos estándar para enviar para incluir el contenido, extracto, título, fecha y muchos más.

Lo que no hay documentación es cómo enviar a un campo personalizado. Sé que es posible con la add_post_meta($post_id, $meta_key, $meta_value, $unique);función.

Pero, ¿cómo incluir eso en la wp_insert_postfunción estándar ?

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );
  wp_insert_post( $my_post );
  ?>
Robin I Knight
fuente

Respuestas:

35

Si lee la documentación wp_insert_post, devuelve el ID de la publicación que acaba de crear.

Si combina eso con la siguiente función __update_post_meta(una función personalizada que adquirí de este sitio y adapté un poco)

/**
  * Updates post meta for a post. It also automatically deletes or adds the value to field_name if specified
  *
  * @access     protected
  * @param      integer     The post ID for the post we're updating
  * @param      string      The field we're updating/adding/deleting
  * @param      string      [Optional] The value to update/add for field_name. If left blank, data will be deleted.
  * @return     void
  */
public function __update_post_meta( $post_id, $field_name, $value = '' )
{
    if ( empty( $value ) OR ! $value )
    {
        delete_post_meta( $post_id, $field_name );
    }
    elseif ( ! get_post_meta( $post_id, $field_name ) )
    {
        add_post_meta( $post_id, $field_name, $value );
    }
    else
    {
        update_post_meta( $post_id, $field_name, $value );
    }
}

Obtendrás lo siguiente:

$my_post = array(
    'post_title' => $_SESSION['booking-form-title'],
    'post_date' => $_SESSION['cal_startdate'],
    'post_content' => 'This is my post.',
    'post_status' => 'publish',
    'post_type' => 'booking',
);
$the_post_id = wp_insert_post( $my_post );


__update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );
Zack
fuente
Muchas gracias. ¿Podría darme una idea sobre la implantación? ES DECIR. cuál pero de código va a dónde. Muchas gracias
Robin I Knight
2
Bien hecho. El segundo bloque de código reemplaza el suyo, los valores de la función son el par de clave / valor de campo personalizado. Coloque la función en la parte superior del script o en un archivo .php separado incluido en la parte superior del script.
aendrew
1
Como nota, uso OOP, así que esa es la razón del publicmodificador frente a "function". Si incluye la función en sí misma sin ponerla en una clase, no necesita agregarlapublic
Zack,
Hola Zack, Aendrew y Philip. Todo funciona muy bien, sin embargo, traté de aplicarlo a una consulta también en vano. No entiendo por qué. Aquí está el enlace, ya que todos saben cómo funcionó la nueva publicación del campo personalizado inicial. Pensé que podría ver mi error. wordpress.stackexchange.com/questions/8622/…
Robin I Knight
1
No puedo agregar una respuesta, ya que no tengo reputación en wordpress.stackexchange. A partir de hoy hay un nuevo método, simplemente puede colocar una matriz en wp_insert_post como: meta_input => array (key => value)
Frederik Witte
13

Simplemente puede agregar 'add_post_meta' después de 'wp_insert_post'

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );

$post_id = wp_insert_post($my_post);

add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true);
add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true);
?>
Philip
fuente
1

No creo que pueda usarlo con wp_insert_post () ;.

La razón se debe a cómo WP almacena los dos tipos de datos. Las publicaciones se almacenan en una gran tabla monolítica con una docena de columnas diferentes (wp_posts); Los campos personalizados se almacenan en una tabla más simple de 4 columnas (wp_postmeta) compuesta principalmente por una metaclave y un valor, asociados con una publicación.

En consecuencia, realmente no puede almacenar campos personalizados hasta que tenga la ID de publicación.

Prueba esto:

function myplugin_insert_customs($pid){

    $customs = array(
    'post_id' => $pid,
    'meta_key' => 'Your meta key',
    'meta_value' => 'Your meta value',
    );

    add_post_meta($customs);

}

add_action('save_post', 'myplugin_insert_customs', 99);

Esta publicación del códice ayudó: es algo opuesto a lo que está haciendo (es decir, eliminar una fila de base de datos al eliminarla): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

aendrew
fuente
En ese caso, la única salida que puedo ver es usar una sesión, ¿sería correcto?
Robin I Knight
Nah Supongo que su complemento está intentando insertar campos personalizados al mismo tiempo que se guarda una publicación, ¿verdad? Creo que lo que debe hacer es conectarse a WP después de guardar la publicación, tomar el nuevo número de identificación de la publicación y luego proporcionarlo a add_post_meta (); para crear los CFs. Actualizaré mi respuesta en un segundo con algún código.
aendrew
Gracias por la ayuda. Por cierto, no es un complemento. Lo escribí para que podamos personalizarlo tanto como sea necesario. (pero no tome eso como que soy bueno con php, solo prueba y error)
Robin I Knight
Es un tema, entonces? La única diferencia real es que pondrías eso en functions.php, en ese caso.
aendrew
1

Use save_postfiltro, luego llame add_post_metaa su función de filtro.

Micah Ernst
fuente
Inútil $ post-> ID no está disponible para wp_insert_post_data, que es necesario para crear campos personalizados.
aendrew
La save_postacción de @aendrew está al final de la función, tiene la identificación de la publicación y el objeto pasado, la respuesta es sólida.
Rarst
1
Estoy bastante seguro de que esto fue editado, Rarst. De todos modos, tiene sentido ahora.
aendrew
@aendrew ah, lo siento, no me di cuenta de eso
Rarst