Initial commit
This commit is contained in:
94
inc/pods-conditional-required.php
Normal file
94
inc/pods-conditional-required.php
Normal file
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
/**
|
||||
* Désactiver le required des champs masqués par la logique conditionnelle de Pods.
|
||||
*
|
||||
* Pods ne prend pas en compte sa propre logique conditionnelle lors de la
|
||||
* validation serveur des champs requis. Ce filtre corrige ce comportement
|
||||
* pour le pod "post".
|
||||
*/
|
||||
add_filter( 'pods_api_pre_save_pod_item_post', 'thalim_skip_required_for_hidden_fields', 10, 3 );
|
||||
|
||||
function thalim_skip_required_for_hidden_fields( $pieces, $is_new_item, $id ) {
|
||||
if ( empty( $pieces['fields'] ) ) {
|
||||
return $pieces;
|
||||
}
|
||||
|
||||
// Récupérer les valeurs actuelles des champs pour évaluer la logique conditionnelle
|
||||
$field_values = [];
|
||||
foreach ( $pieces['fields'] as $name => $field ) {
|
||||
$field_values[ $name ] = isset( $field['value'] ) ? $field['value'] : '';
|
||||
}
|
||||
// Pour un post existant, si un champ n'a pas été soumis explicitement via
|
||||
// pods_meta_* (ex. Pods DFV React en éditeur classique), remplir sa valeur
|
||||
// depuis la BDD. Cela corrige à la fois :
|
||||
// - la validation du champ lui-même (pieces['fields']['value'])
|
||||
// - l'évaluation de la logique conditionnelle des autres champs ($field_values)
|
||||
if ( ! $is_new_item && $id ) {
|
||||
foreach ( $pieces['fields'] as $name => $field ) {
|
||||
// Skip pick/file/avatar fields: their value format in $pieces is complex
|
||||
// and get_post_meta returns a raw value that corrupts Pods' pick processing.
|
||||
// These fields are always submitted via POST by Pods DFV React.
|
||||
$field_type = pods_v( 'type', $field, '' );
|
||||
if ( in_array( $field_type, [ 'pick', 'file', 'avatar' ], true ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$current_val = isset( $field['value'] ) ? $field['value'] : '';
|
||||
if ( ( '' === $current_val || null === $current_val ) && ! isset( $_POST[ 'pods_meta_' . $name ] ) ) {
|
||||
$db_val = get_post_meta( (int) $id, $name, true );
|
||||
if ( '' !== $db_val && null !== $db_val ) {
|
||||
$pieces['fields'][ $name ]['value'] = $db_val;
|
||||
$field_values[ $name ] = $db_val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( $pieces['fields'] as $field_name => $field_data ) {
|
||||
// Ne traiter que les champs required
|
||||
$required = is_object( $field_data ) && method_exists( $field_data, 'get_field_object' )
|
||||
? (int) $field_data->get_field_object()->get_arg( 'required', 0 )
|
||||
: (int) pods_v( 'required', $field_data, 0 );
|
||||
|
||||
if ( 1 !== $required ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Récupérer la logique conditionnelle
|
||||
$conditional_logic = null;
|
||||
|
||||
if ( is_object( $field_data ) && method_exists( $field_data, 'get_field_object' ) ) {
|
||||
$conditional_logic = $field_data->get_field_object()->get_conditional_logic();
|
||||
}
|
||||
|
||||
// Fallback : charger le champ via l'API Pods
|
||||
if ( ! $conditional_logic ) {
|
||||
$field_obj = pods_api()->load_field( [
|
||||
'name' => $field_name,
|
||||
'pod' => 'post',
|
||||
] );
|
||||
|
||||
if ( $field_obj && method_exists( $field_obj, 'get_conditional_logic' ) ) {
|
||||
$conditional_logic = $field_obj->get_conditional_logic();
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! $conditional_logic ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Évaluer si le champ est visible avec les valeurs actuelles
|
||||
if ( ! $conditional_logic->is_visible( $field_values ) ) {
|
||||
// Le champ est masqué → désactiver le required
|
||||
if ( is_object( $field_data ) && method_exists( $field_data, 'get_field_object' ) ) {
|
||||
$field_data->get_field_object()->set_arg( 'required', 0 );
|
||||
}
|
||||
$pieces['fields'][ $field_name ]['required'] = 0;
|
||||
if ( isset( $pieces['fields'][ $field_name ]['options'] ) ) {
|
||||
$pieces['fields'][ $field_name ]['options']['required'] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $pieces;
|
||||
}
|
||||
Reference in New Issue
Block a user