Existe algum filtro / gancho de ação para validar um campo personalizado antes de publicar o post?

10

Eu tenho um campo personalizado chamado xxxx_url . xxxx_url deve ser único.

Então, antes de publicar a postagem, quero garantir que xxxx_url seja único ou não? Se não for único, a publicação da postagem deve ser rejeitada.

Eu tentei publish_post . Mas essa não é a correta, pois é acionada quando publicamos o post. Quero executar meu código antes da publicação.

    
por I am the Most Stupid Person 31.08.2018 / 08:26

4 respostas

5

No início de wp_insert_post , a função que salva / atualiza uma postagem, há uma filtro chamado wp_insert_post_empty_content . Por padrão, este filtro verifica se os campos de título, editor e trecho estão vazios, caso em que o processo de salvamento será interrompido.

No entanto, como todos os campos a serem salvos são passados para esse filtro, você pode expandir esse filtro para incluir qualquer outro teste para determinar se a postagem deve ser considerada vazia. Seria algo assim:

add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {

  // extract custom field from $postarr, check uniqueness

  if ($unique) return false else return true;
  }

Nota: a função deve retornar 'true' para interromper o processo de salvamento.

Se o campo personalizado não for exclusivo, você também poderá repetir um aviso.

    
por cjbj 09.09.2018 / 13:19
1

Que tal usar o AJAX para verificar a exclusividade antes mesmo de enviar o post para publicação?

$( '#post' ).on( 'submit', function( event ) {
  event.preventDefault(); // Prevent publishing

  //Now do some AJAX Checks
  $.post( ajaxurl, data, function(response) {
    if ( response === 'success' ) {
        $( this ).off( event ).submit();
    } else {
        alert( 'The custom field must be unique' );
    }
  });
});  

Embora o código não seja testado, mas deve funcionar. Você pode precisar brincar com ele para obter o resultado desejado.

    
por Abhik 09.09.2018 / 20:06
0

Eu entraria em wp_insert_post_data filtro e lidaria com isso da forma menos intrusiva possível, porque, como eu entendi, você não Se você quiser bloquear a inserção de uma postagem, apenas evite publicar uma postagem com valores meta duplicados.

Eu não posso gastar muito neste caso porque você não compartilhou nenhum código, mas aqui está algum pseudo-código de um filtro que funcionaria:

function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
    // setup an uniqueness flag.
    $meta_is_unique = true;

    // check if the meta is unique and modify the '$meta_is_unique' flag accordingly.
    // {...} <- your code

    // if the meta is NOT unique keep the post status in draft.
    if ( ! $meta_is_unique ) {
        // you can force the current post to be draft until the meta value will became unique.
        $data['post_status'] = 'draft';
        // maybe, update the meta value with a hint of the fact that it's not unique.
        // or display a dashboard notice about it.
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );

Outra grande coisa sobre esse filtro é que ele é separado dos anexos, um wp_insert_attachment_data .

Espero que ajude, e faça o que fizer, soa incrível!

    
por Andrei 03.09.2018 / 16:29
-1

A verificação deve ir para wp_insert_post . Esse gancho é acionado sempre que uma postagem é publicada ou editada.

Lá, você pode fazer uma consulta personalizada para verificar se alguma postagem já tem o mesmo valor xxxx_url ou não.

add_action('wp_insert_post', function($post_id) {
    $meta_key = 'xxxx_url';
    $meta_value = get_post_meta($post_id, $meta_key, true);
    $query = new WP_Query([
        'post_type' => get_post_type($post_id),     // This might be unnecessary, if you check 'post' post type only. Or use 'any'.
        'meta_query' => [
            [
                'meta_key' => $meta_key,
                'meta_value' => $meta_value,
            ]
        ]
    ]);
    if ($query->have_posts()) {
        // invalid key, post with the same value already exists
    } else {
        // valid, key was not found anywhere
    }
});
    
por Petr Cibulka 03.09.2018 / 13:26