Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Metaboxes funcionam em localhost mas não em servidor web

Olá! Adicionei a seguinte função para inserir quatro campos de cadastro em um custom type:

https://jsfiddle.net/guibattoni/j77ds44n/

No localhost funciona perfeitamente. Porém quando subi para um servidor web, recebo o seguinte erro em todos os campos:

Notice: Undefined index: quantidade in /home/btt.com.br/public/btt-01/wp-content/themes/btt/functions.php on line 234 Call Stack: 0.0162 2675361. {main}() /home/btt.com.br/public/btt-01/wp-admin/post-new.php:0 1.4450 335221122. include('/home/btt.com.br/public/btt-01/wp-admin/edit-form-advanced.php') /home/btt.com.br/public/btt-01/wp-admin/post-new.php:85 1.9820 347021363. do_meta_boxes() /home/btt.com.br/public/btt-01/wp-admin/edit-form-advanced.php:693 1.9834 347044564. call_user_func:{/home/btt.com.br/public/btt-01/wp-admin/includes/template.php:1045}() /home/btt.com.br/public/btt-01/wp-admin/includes/template.php:1045 1.9834 347045445. informacoes_produtos_view() /home/btt.com.br/public/btt-01/wp-admin/includes/template.php:1045

Toda as outras funcionalidades do sistema estão funcionando corretamente. Porém, na página de produtos (custom type em questão) recebo esse erro a página não responde aos comandos enviados (Publicar por exemplo). No entanto, os dados são cadastrados normalmente no banco de dados.

Alguém tem a solução para este erro?

8 respostas

Oi Guilherme, tudo bem? O erro diz que no seu array produtos_meta_data não há definido a chave quantidade.

Onde você define esse array? Como você evita por exemplo erros em posts novos onde esses valores não existem?

Olá anderson!

A primeira referência que faço a ele está aqui:

function informacoes_produtos_view( $post ) { $produtos_meta_data = get_post_meta( $post->ID ); ?>

Antes de tentar puxar os dados, verifico se eles existem:

function salvar_meta_info_produtos( $post_id ) {
    if( isset($_POST['preco_geral']) ) {
        update_post_meta( $post_id, 'preco_geral', sanitize_text_field( $_POST['preco_geral'] ) );
    }
    if( isset($_POST['preco_promo']) ) {
        update_post_meta( $post_id, 'preco_promo', sanitize_text_field( $_POST['preco_promo'] ) );
    }
    if( isset($_POST['quantidade']) ) {
        update_post_meta( $post_id, 'quantidade', sanitize_text_field( $_POST['quantidade'] ) );
    }
    if( isset($_POST['peso']) ) {
        update_post_meta( $post_id, 'peso', sanitize_text_field( $_POST['peso'] ) );
    }
}

add_action('save_post', 'salvar_meta_info_produtos');

Note que essas funcionalidades funcionam perfeitamente em localhost. Os dados desses quatro campos são armazenados corretamente no banco de dados e ao tentar visualizar o post para edição, os dados cadastros anteriormente (se existirem) também são apresentados.

Mas ao subir para o servidor, nenhuma função foi alterada. Mas esse erro foi apresentado. *

*importei o banco de dados local. Todas os outros dados são apresentados corretamente.

Olha Guilherme, quando você vai criar um novo post, nenhum desses dados existem, como você faz pra criar o metabox nesse caso? Quando você entra pra criar um novo post, não existe $_POST.

O get_post_meta vai carregar todos os custom fields, mas nesse processo, o seu campo quantidade não existe.

Em localhost suas configurações permitem a exibição dos erros?

Entendi Anderson. Eu creio que os erros não sejam apresentados e talvez por isso tenha tido um resultado diferente. Essa parte do código eu tirei da aula 6 do curso de criação de temas para WP aqui da alura. Vou rever a aula e checar se deixei passar algum detalhe.

O estranho é que localmente a página funciona normal e no front os resultados são apresentados perfeitamente. Mas no servidor, além de mostrar esses erros dentro de cada input, a página não recarrega ao tentar publicar o post por exemplo ou ao tentar acrescentar uma nova categoria. Além disso, no front os resultados são apresentados mas acompanhados de diversos erros.

Pode verificar também as versões do PHP em localhost e em produção?

solução!

O problema não se encontra neste trecho de código postado.

No caso de salvar os dados do metabox, já está sendo verificado se a chave "quantidade" existe no POST.

O update_post_meta( $post_id, 'quantidade', $_POST['quantidade']); não vai dar erro porque o segundo parâmetro aceita qualquer coisa. Como o terceiro parâmetro (o valor) já foi validado antes de rodar, e o $post_id existe, o problema está na visualização do metabox

Por padrão, o modo de debug do Wordpress é desativado. Se você ativar (no arquivo wp_config.php), vai dar exatamente o que foi descrito, ou seja, ao abrir o admin para inserir um novo registro, vai dar erro de "notice" dentro de cada caixa do metabox. Isso deve estar ativado em seu servidor.

Exemplo:

<?
$imoveis_meta_data = get_post_meta( $post-> ID );
?>

<input id="maluras-vagas-input" class="maluras-metabox-input" type="text" name="email"
            value="<?= $imoveis_meta_data['email'][0]; ?>">

O código acima vai dar "notice" ao abrir um novo registro porque se quer imprimir um valor de um array que está vazio, já que ao criar um novo registro não existem meta dados gravados.

O erro somente vai sumir se você gravar dados e voltar para atualizar.

Evitar o erro é fácil. Basta criar uma variável para cada input e usar o isset(). Exemplo:

<?
$imoveis_meta_data = get_post_meta( $post-> ID );
$email = "";
if (isset($imoveis_meta_data['email'][0])){
$email = $imoveis_meta_data['email'][0];
}
?>

<input id="maluras-vagas-input" class="maluras-metabox-input" type="text" name="email"
            value="<?= $email; ?>">

Oi Guilherme, você postou no fórum de primeiros passos, aquele que não é voltado para programação.

Da próxima vez, poste no fórum dos cursos para programadores de wordpress para ajudar nossos moderadores a enquadrar bem o seu problema.

Vou deixar esse post aqui porque já começaram a responder.

Boa noite! Primeiro de tudo peço desculpas pela demora no retorno! Muitíssimo obrigado pela ajuda. Obrigado pelo esforço e disposição Anderson!

E muito obrigado pela ajuda Daniel. Solucionou o problema aqui! :)

Sobre o local de postagem Flávio, eu utilizei os filtros e por isso postei aqui. O único filtro de WP leva até essa seção. Aonde consigo mais informações sobre os locais corretos para postar?