¿Hay algún filtro / enlace de acción para validar un campo personalizado antes de publicar la publicación?

11

Tengo un archivo personalizado llamado xxxx_url. xxxx_urlDebería ser único.

Entonces, antes de publicar la publicación, ¿quiero asegurarme de que xxxx_urlsea ​​única o no? Si no es único, la publicación de la publicación debe ser rechazada.

Probé publish_post. Pero esa no es la correcta, ya que se activa cuando publicamos la publicación. Quiero ejecutar mi código justo antes de la publicación.

Soy la persona mas estupida
fuente
1
¿Por qué no establecer la ID de publicación actual como el valor único? Me gusta: 132_urldónde 132está el ID de la publicación. Que siempre tiene un valor único aquí. Además de eso: los campos personalizados se deben guardar en la save_postacción. En esta acción, puede verificar el campo personalizado (si no está vacío y tiene un valor único, por ejemplo), y según esto update_post_metao no. Supongo que podría también comprobar el campo personalizado y si no tiene un valor único, establecer el post-statusa drafto alguna otra cosa, a la publicación de bloqueo. De lo contrario, creo que necesitas jQuery para hacer esto.
LWS-Mo

Respuestas:

5

Al principio de wp_insert_postla función que guarda / actualiza una publicación, hay un filtro llamado wp_insert_post_empty_content. Por defecto, este filtro verifica si los campos de título, editor y extracto están vacíos, en cuyo caso el proceso de guardar se detendrá.

Sin embargo, dado que todos los campos que se guardarán se pasan a este filtro, puede expandir este filtro para incluir cualquier otra prueba para determinar si la publicación debe considerarse vacía. Sería algo como esto:

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: la función debe devolver 'verdadero' para detener el proceso de guardado.

Si el campo personalizado no es único, también puede hacer eco de una advertencia.

cjbj
fuente
2
Esto probablemente funcionará, pero se parece un poco más a un truco que a ser una solución. También he considerado esto, pero luego decidí no publicar, ya que wp_insert_post_empty_contentestá semánticamente destinado a contenido vacío . Dicho esto, tampoco encontré ningún gancho que sea semánticamente adecuado para esto.
Scott, el
Bueno, si fuera solo por título y contenido vacíos, no habría un filtro para desarrolladores.
cjbj
1
Si te enfocas menos en la mera palabra 'vacío', diría que este filtro está destinado a verificar si la publicación cumple con los requisitos mínimos para guardar. OP quiere ampliar los requisitos mínimos. Quizás el filtro debería nombrarse wp_insert_post_valid_contentpara expresar eso, pero por lo demás está exactamente en el lugar correcto.
cjbj
@cjbj Cuando tiene una pregunta como esta, ¿cómo encuentra el filtro correcto? Quiero decir, ¿cómo encontraste el wp_insert_post_empty_contentfiltro?
Soy la persona más estúpida
1
Bueno, cuando has estado trabajando con WP durante algún tiempo, sabes qué parte del código genera qué partes del administrador. Entonces, busca el archivo y verifica el código fuente de los filtros disponibles.
cjbj
1

¿Qué tal usar AJAX para verificar la unicidad antes de enviar la publicación para su publicación?

$( '#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' );
    }
  });
});  

Aunque el código no se ha probado, debería funcionar. Es posible que deba jugar con él para obtener el resultado deseado.

Abhik
fuente
0

Me conectaría al filtro wp_insert_post_data y manejaría esto de la manera menos intrusiva posible porque, según tengo entendido, no quieres bloquear la inserción de una publicación, solo debes evitar publicar una publicación con meta valores duplicados.

No puedo ahorrar demasiado en este caso porque no compartiste ningún código, pero aquí hay un pseudocódigo de un filtro que funcionaría:

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' );

Otra gran cosa sobre este filtro es que está separado de los archivos adjuntos wp_insert_attachment_data.

Espero que ayude, y hagas lo que hagas, ¡suena increíble!

Andrei
fuente
2
Eso puede no ser una buena idea. ¿Qué pasa si $data['post_status']es publishy el usuario lo está actualizando? ¿Hacer la publicación como draftcrear un 404problema para esa publicación?
Scott
@Scott En otras palabras, si una publicación publicada detecta al guardar que su metavalor no es único, la publicación de la publicación debe rechazarse y la publicación debe redactarse. Nuevamente, no sé cuán importante es ese metavalor, pero si se trata de un tipo de datos de clasificación o algo esencial, entonces el estado de la publicación debe ser borrador (lo que no significa un problema 404, solo dice que la publicación ha sido retirado de la vista pública)
Andrei
-1

El cheque debe ir a wp_insert_post. Este gancho se activa cada vez que se publica o edita una publicación.

Allí, puede hacer una consulta personalizada para verificar, si hay alguna publicación que ya tenga el mismo xxxx_urlvalor o no.

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
fuente
3
Como sé, lo que escribas dentro si la publicación de la declaración / else se publicará ya que la wp_insert_postacción se dispara una vez que se ha guardado una publicación, no puede bloquear la publicación o inserción de publicaciones.
Soy la persona más estúpida el
Entonces, ¿desea bloquear la publicación, si la publicación falla la validación? No has escrito eso en tu pregunta.
Petr Cibulka
Lo he mencionado claramente If it isn't unique it should reject publishing post.en mi pregunta.
Soy la persona más estúpida