95 lines
3.4 KiB
PHP
95 lines
3.4 KiB
PHP
<?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;
|
|
}
|