Existe uma maneira de definir campos personalizados padrão ao criar uma postagem?

11

Ao criar uma nova postagem, logo após clicar em "Adicionar novo" , quando o editor de postagens aparecer, em vez de usar o menu suspenso e escolher um campo personalizado para usar, eu gostaria de ter algumas entradas de campo personalizadas padrão extremidade aberta.

Visualmente, em vez de:

insira a descrição da imagem aqui

Eu gostaria de ter algo como:

insira a descrição da imagem aqui

Eu sei que existem plugins para isso (CPT, mais campos, etc.), mas eu gostaria de uma maneira simples de fazer isso com uma função básica.

Tentei algo assim (estou usando um tipo de postagem personalizado 'product'):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

Mas isso não parece funcionar. Eu acho que o gancho provavelmente está errado (porque edit_postvem após uma atualização), mas não vejo nenhum gancho para "nova publicação" (logo após o usuário clicar em "nova publicação" no wp admin). Existe algum?

Ou talvez toda a idéia esteja errada e haja outra maneira?

mike23
fonte

Respostas:

9

O gancho de ação save_posté chamado ao salvar, mas não sei se você pode adicionar metadados no momento. Mas deve ser possível criar / atualizar seus metadados após a postagem ter sido salva com o gancho de ação updated_post_meta.

EDITAR

Para pré-selecionar alguns meta-campos (campos personalizados) na tela de pós-criação, você deve adicionar esses meta-valores primeiro com um valor vazio.

Se você observar a post_custom_meta_box()função (que é o retorno de chamada para a metabox usada postcustom) no arquivo wp-admin/includes/meta-boxes.php, poderá ver que a função está sendo usada list_meta()para criar os meta-campos pré-selecionados.

Agora vamos dar uma olhada no fluxo do programa até que esta metabox seja exibida (estamos procurando um gancho de ação / filtro que possamos usar aqui):

  1. WordPress carrega o arquivo post-new.php
  2. Este arquivo gera um post padrão no banco de dados on-line 39com a função get_default_post_to_edit(). Isso é bom. Basicamente, a postagem já está no banco de dados como um rascunho automático. Infelizmente, não há nenhum gancho no momento para alterar esses dados ou adicionar algo novo.
  3. Como próximo passo, o arquivo edit-form-advaned.phpestá incluído. Este arquivo irá gerar a página de administração do furo e inclui todos os metaboxes necessários com base no supportsparâmetro do tipo de postagem.
  4. On-line, 136os campos personalizados metabox postcustomestão incluídos e a função acima é chamada. Novamente, nenhum gancho de ação que poderíamos usar.

Conclusão

Eu acho que a única maneira que você pode fazer é usar o jQuery ou sobrecarregar o postcustommetabox e adicionar os meta-valores antes de executar a list_meta()função.

Por exemplo

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}
rofflox
fonte
A coisa é que eu não estou tentando acrescentar nada sobre excepto por agora, eu estou tentando mostrar algumas entradas de campo personalizado já abertas quando os arrvies usuário na página de edição (ver as atualizações com screenshots)
mike23
Ah Agora eu entendo o seu problema. Eu editei minha resposta.
Rofflox 25/09
3

Este é o método adequado para adicionar suporte a campos personalizados (você não recebe os campos em branco ao editar postagens)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');
Yuri Korolov
fonte
1

Você deve usar a ação save_post e isolar sua operação, verificando o tipo de postagem, pois isso é executado em todos os tipos de postagem. Obviamente, há um pouco mais de lógica que você precisará incorporar a isso para que funcione para você. Você provavelmente deve definir um meta-campo de postagem que verifique se definiu os padrões uma vez, para que seus usuários não fiquem frustrados se desejarem deixar um campo de meta-postagem em branco.

Se você deseja que os padrões sejam nulos (como visto no seu exemplo de código), não crie uma função, pois isso apenas adiciona campos de meta e pós-metadados não são preenchidos com valores por padrão.

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
Brian Fegter
fonte
1

Estou procurando uma meta descrição única para cada postagem personalizada em um site WP que estou desenvolvendo. Então, eu também estava procurando um campo personalizado padrão e cheguei aqui.

Sei que este é um post bastante antigo, mas achei que publicaria a resposta simples que encontrei em mariokostelac.com .

kg é o meu espaço para nome, você pode nomear a função como quiser. Sou bastante iniciante em customizações de hooks e WP em geral, mas acredito que wp_insert_post é o hook que você está procurando.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}
Kaplan
fonte
FYI: Há get_post_type(). Além disso, ao fazer uma comparação livre, você deve usar a sintaxe de condição do estilo YODA.
Kaiser #
@kaiser, o que você quer dizer com estilo YODA? Também porque é get_post_type($post_id) melhor que $_GET['post_type']?
Aziz
11
Use o valor antes da comparação: 'page' === $_GET['post_type']. Caso contrário , quando você esquecer um único, =poderá acabar em uma situação em que atribui um valor em vez de comparar dois valores. E isso acabará como lixo no seu banco de dados. Você também pode querer usar === segura tipo de comparação (é o valor pagee é o valor do tipo? string?)
kaiser
11
@ Kasier eu vejo - então o código final é algo como 'page' === get_post_type($post_id) :?
Aziz
-1

se alguém precisar de campo personalizado por tipo de postagem, deixo o código abaixo da maneira que eu fiz e funciona bem para mim :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action ('wp_insert_post', 'awh_field_type');

Edgardo Aleman
fonte