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

11

Eu tenho um arquivo personalizado chamado xxxx_url. xxxx_urldeve ser único.

Então, antes de publicar o post, quero ter certeza de que xxxx_urlé único ou não? Se não for exclusivo, a publicação da postagem deve ser rejeitada.

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

Eu sou a pessoa mais estúpida
fonte
11
Por que não definir o ID da postagem atual como o valor exclusivo. Como: 132_urlonde 132está o ID da postagem. Do que você sempre tem um valor único aqui. Além disso: campos personalizados devem ser salvos na save_postação. Nesta ação, você pode verificar o campo personalizado (se não estiver vazio e tiver um valor exclusivo, por exemplo) e com base nisso update_post_metaou não. Eu acho que você também pode verificar o campo personalizado e, se ele não tiver um valor exclusivo, defina post-statuscomo draftou algo mais, para desativar a publicação. Caso contrário, acho que você precisa do jQuery para fazer isso.
LWS-Mo

Respostas:

5

No início de wp_insert_post, a função que salva / atualiza uma postagem, existe um filtro chamado wp_insert_post_empty_content. Por padrão, esse filtro verifica se os campos de título, editor e trecho estão todos vazios; nesse caso, 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 como isto:

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á ecoar um aviso.

cjbj
fonte
2
Provavelmente isso funcionará, mas parece um pouco mais um hack do que uma solução. Também considerei isso, mas depois decidi não postar, pois ele wp_insert_post_empty_contenté semanticamente destinado ao conteúdo vazio . Dito isto, também não encontrei nenhum gancho semanticamente adequado para isso.
Scott
Bem, se fosse apenas para título e conteúdo vazios, não haveria um filtro para os desenvolvedores.
cjbj
11
Se você se concentrar menos na mera palavra "vazio", eu diria que esse filtro deve verificar se a postagem atende aos requisitos mínimos de economia. O OP quer ampliar os requisitos mínimos. Talvez o filtro deva ser nomeado wp_insert_post_valid_contentpara expressar isso, mas, de resto, ele está exatamente no lugar certo.
Cjbj 09/09
@cjbj Quando você tem uma pergunta como esta, como encontra o filtro correto? Quero dizer, como você encontrou wp_insert_post_empty_contentfiltro?
Eu sou a pessoa mais burra
11
Bem, quando você trabalha com o WP há algum tempo, você sabe qual parte do código gera quais partes do administrador. Então, procure o arquivo e verifique o código-fonte para obter os filtros disponíveis.
precisa saber é
1

Que tal usar o AJAX para verificar a exclusividade antes mesmo de enviar a publicação 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, ele deve funcionar. Você pode precisar jogar com ele para obter o resultado desejado.

Abhik
fonte
0

Gostaria de conectar- me ao filtro wp_insert_post_data e lidar com isso da maneira menos invasiva possível, porque, como eu entendo, você não deseja bloquear a inserção de uma postagem, apenas deseja evitar a publicação de uma postagem com meta-valores duplicados.

Não posso poupar muito neste caso, porque você não compartilhou nenhum código, mas aqui está um 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 wp_insert_attachment_data.

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

Andrei
fonte
2
Isso pode não ser uma boa ideia. E se $data['post_status']houver publishe o usuário estiver atualizando? Fazer a postagem como draftcriar um 404problema para essa postagem?
Scott
@ Scott Em outras palavras, se uma postagem publicada detectar ao salvar que seu valor meta não é exclusivo, a publicação da postagem deve ser rejeitada e a postagem deve ser redigida. Novamente, eu não sei o quão importante é esse valor meta, mas se for um tipo de dados de classificação ou algo essencial, o status da postagem deverá ser rascunho (o que não significa um problema 404, apenas diz que a postagem foi aposentou-se da vista do público)
Andrei
-1

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

Lá, você pode fazer uma consulta personalizada para verificar se há alguma postagem que já tenha o mesmo xxxx_urlvalor 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
    }
});
Petr Cibulka
fonte
3
Como eu sei, o que quer que você escreva na postagem de instrução if / else será publicada, pois a wp_insert_postação é acionada depois que uma postagem é salva, e não pode bloquear a publicação ou a inserção da postagem.
Eu sou a pessoa mais estúpida
Então, você deseja bloquear a publicação, se a postagem falhar na validação? Você não escreveu isso na sua pergunta.
Petr Cibulka
Mencionei isso claramente If it isn't unique it should reject publishing post.na minha pergunta.
Eu sou a pessoa mais estúpida