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

10

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

Entonces, antes de publicar la publicación, quiero asegurarme de que xxxx_url es único o no. Si no es único, la publicación de la publicación debería ser rechazada.

Intenté 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.

    
pregunta I am the Most Stupid Person 31.08.2018 - 08:26

4 respuestas

5

Al comienzo de wp_insert_post , la función que guarda / actualiza una publicación, hay una filtro denominado wp_insert_post_empty_content . De forma predeterminada, este filtro verifica si los campos de título, editor y extracto están vacíos, en cuyo caso se detendrá el proceso de guardado.

Sin embargo, dado que todos los campos a guardar 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 'true' para detener el proceso de guardado.

Si el campo personalizado no es único, es posible que también desee repetir una advertencia.

    
respondido por el cjbj 09.09.2018 - 13:19
1

¿Qué te parece usar AJAX para verificar la singularidad incluso antes de enviar la publicación para 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. Puede que necesites jugar con él para obtener el resultado deseado.

    
respondido por el Abhik 09.09.2018 - 20:06
0

Me engancharía al filtro wp_insert_post_data y manejaría esto de la forma menos intrusiva posible porque entiendo que no Si no desea bloquear la inserción de una publicación, solo desea evitar publicar una publicación con valores meta duplicados.

No puedo ahorrar demasiado en este caso porque no compartiste ningún código, pero aquí hay un pseudo-có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 one wp_insert_attachment_data .

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

    
respondido por el Andrei 03.09.2018 - 16:29
-1

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

Allí, puedes hacer una consulta personalizada para verificar, si hay alguna publicación que ya tenga el mismo valor xxxx_url 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
    }
});
    
respondido por el Petr Cibulka 03.09.2018 - 13:26

Lea otras preguntas en las etiquetas