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

10

Quando estou criando uma nova postagem, logo após clicar em "Adicionar novo" , quando o editor de postagem é exibido, em vez de usar o menu suspenso e escolher um campo personalizado a ser usado, Eu gostaria de ter algumas entradas de campo personalizadas padrão já openend.

Visualmente, em vez de:

Eugostariadeteralgocomo:

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.

Eu tentei algo assim (estou usando um tipo de postagem personalizado 'produto'):

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 hook provavelmente está errado (porque edit_post vem depois de uma atualização), mas eu não vejo nenhum hook para "new post" (logo após o usuário clicar em "new post" no wp admin). Existe algum?

Ou talvez a ideia toda esteja errada e haja outro jeito?

    
por mike23 24.09.2011 / 18:46

5 respostas

8

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 depois que a postagem foi 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 valores meta primeiro com um valor vazio.

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

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

  1. o WordPress carrega o arquivo post-new.php
  2. Esse arquivo gera uma postagem padrão no banco de dados na linha 39 com a função get_default_post_to_edit() . Isso é bom. Basicamente, o post já está no banco de dados como um rascunho automático. Infelizmente, não há nenhum gancho neste momento para alterar esses dados ou adicionar algo novo.
  3. Como próximo passo, o arquivo edit-form-advaned.php é incluído. Esse arquivo gerará a página de administração do furo e incluirá todos os metaboxes necessários com base no parâmetro supports do tipo de postagem.
  4. Na linha 136 , os campos personalizados metabox postcustom estão incluídos e a função acima é chamada. Mais uma vez, nenhum gancho de ação que pudéssemos usar.

Conclusão

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

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()
}
    
por rofflox 24.09.2011 / 19:26
3

Este é o método adequado para adicionar suporte a campos personalizados (você não obtém os campos em branco quando edita 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');
    
por Yuri Korolov 13.02.2013 / 01:34
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á mais alguma lógica que você terá para construir isso para que ela funcione para você. Provavelmente, você deve definir um campo meta-meteo que verifique se você definiu os padrões uma vez para que seus usuários não fiquem frustrados se eles quiserem deixar um campo meta meta em branco.

Se você deseja que os padrões sejam nulos (como visto em seu exemplo de código), então não crie uma função porque isso apenas adiciona sobrecarga e os campos pós-meta 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');
    
por Brian Fegter 25.09.2011 / 06:42
1

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

Eu sei que este é um post bem antigo, mas eu pensei em postar a resposta simples que encontrei em mariokostelac.com .

kg é o meu namespace, você pode nomear a função que você gosta. Eu sou muito novo para ganchos e personalização de WP em geral, mas eu acredito que wp_insert_post é o gancho 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;
}
    
por kaplan 13.09.2012 / 14:01
-1

se alguém precisar de um campo personalizado por tipo de post eu deixo o código abaixo do jeito que fiz e trabalho 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');

    
por Edgardo Aleman 19.05.2016 / 20:27