WP inserir função PHP pós e campos personalizados


26

A função WordPress é usada para enviar dados programaticamente. Campos padrão a serem enviados para incluir o conteúdo, trecho, título, data e muito mais.

O que não existe documentação é como enviar para um campo personalizado. Eu sei que é possível com a add_post_meta($post_id, $meta_key, $meta_value, $unique);função.

Mas, como incluir isso na wp_insert_postfunção padrão ?

<?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 );
  ?>

Respostas:


35

Se você ler a documentação wp_insert_post, ela retornará o ID da postagem que você acabou de criar.

Se você combinar isso com a seguinte função __update_post_meta(uma função personalizada que adquiri deste site e adaptei um pouco)

/**
  * 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 );
    }
}

Você obterá o seguinte:

$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' );

Muito obrigado. Você poderia me dar uma idéia sobre a implantação. IE. qual mas do código vai aonde. Muito obrigado
Robin I Knight

2
Bem feito. O segundo bloco de código substitui o seu, os valores da função são o par de chave / valor do campo personalizado. Coloque a função na parte superior do script ou em um arquivo .php separado, incluído na parte superior do script.
aendrew

11
Como uma observação, eu uso OOP, então essa é a razão do publicmodificador na frente de "function". Se você está incluindo a função de si mesmo, sem colocá-lo em uma classe, você não precisa adicionarpublic
Zack

Olá Zack, Aendrew e Philip. Tudo está funcionando lindamente, no entanto, tentei aplicá-lo a uma consulta sem sucesso. Eu não vejo bem o porquê. Aqui está o link, já que todos sabem como o novo campo personalizado inicial funcionou, pensei que você pudesse ver meu erro. wordpress.stackexchange.com/questions/8622/…
Robin I Knight

11
Não consigo adicionar uma resposta, pois não tenho reputação no wordpress.stackexchange. A partir de hoje há um novo método, você pode simplesmente colocar em uma matriz em wp_insert_post como: meta_input => array (key => value)
Frederik Witte

13

Você pode simplesmente adicionar o 'add_post_meta' após o '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);
?>

1

Eu não acho que você pode usá-lo com wp_insert_post () ;.

O motivo é o motivo pelo qual o WP armazena os dois tipos de dados. As postagens são armazenadas em uma grande tabela monolítica com uma dúzia de colunas diferentes (wp_posts); os campos personalizados são armazenados em uma tabela mais simples de 4 colunas (wp_postmeta) composta principalmente de uma meta-chave e valor, associados a uma postagem.

Consequentemente, você não pode realmente armazenar campos personalizados até ter o ID da postagem.

Tente o seguinte:

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 publicação do códice ajudou - é quase o oposto do que você está fazendo (ou seja, excluir uma linha do banco de dados após a exclusão): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post


Nesse caso, a única saída que posso ver é usar uma sessão, se isso estiver correto.
Robin I Knight

Nah; Acho que seu plug-in está tentando inserir campos personalizados ao mesmo tempo em que uma postagem é salva, certo? Eu acho que o que você precisa fazer é conectar-se ao WP após a postagem ser salva, pegar o novo número de identificação da postagem e fornecer isso para add_post_meta (); para criar os CFs. Vou atualizar minha resposta em um segundo com algum código.
aendrew

Obrigado pela ajuda. A propósito, não é um plugin. Eu escrevi para que possamos personalizá-lo o quanto for necessário. (mas não que isso significa que eu sou boa com php, apenas tentativa e erro)
Robin I Cavaleiro

É um tema, então? A única diferença real é que você colocaria isso em functions.php, nesse caso.
aendrew

1

Use o save_postfiltro e chame add_post_metasua função de filtro.


Inútil. O ID $ post-> não está disponível para wp_insert_post_data, necessário para criar campos personalizados.
aendrew

A save_postação @aendrew está no final da função, possui o ID e o objeto da postagem, a resposta é boa.
Rarst

11
Tenho certeza que isso foi editado, Rarst. Independentemente disso, faz sentido agora.
aendrew

@aendrew ah, desculpe - não notou que
Rarst
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.