Corrections Pods (sous-types custom-simple, sync pick→taxonomie), agenda accueil et gras/italique single
This commit is contained in:
107
inc/pods-custom-simple-decode.php
Normal file
107
inc/pods-custom-simple-decode.php
Normal file
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
/**
|
||||
* Corrige la sauvegarde des champs pick « custom-simple » dont une option
|
||||
* contient un caractère spécial HTML (', ", &, <, >).
|
||||
*
|
||||
* Symptôme : sélectionner « Journée d'étude » dans le menu `type_*` puis
|
||||
* enregistrer ne sauvegarde rien — le champ reste vide.
|
||||
*
|
||||
* Cause : le front-end Pods (DFV/React) encode la *valeur* des options avec
|
||||
* htmlspecialchars (ex. « Journée d'étude » → « Journée d'étude »), alors
|
||||
* que la liste des valeurs valides (`pick_custom`) contient l'apostrophe brute.
|
||||
* À la sauvegarde, PodsAPI::save_pod_item compare la valeur reçue aux options
|
||||
* autorisées (isset($custom_values[$v])) : « Journée d'étude » ne matche
|
||||
* aucune clé → la valeur est rejetée, et PodsMeta l'écrit vide.
|
||||
*
|
||||
* Correctif : on rejoue l'inverse de l'encodage (html_entity_decode) sur la
|
||||
* valeur des champs pick custom-simple dans `pods_api_pre_save_pod_item_post`,
|
||||
* qui s'exécute *avant* la validation des options. « Journée d'étude »
|
||||
* redevient « Journée d'étude » et matche l'option. Sans effet sur les valeurs
|
||||
* sans caractère spécial (décodage no-op) ni sur les données existantes.
|
||||
*/
|
||||
add_filter( 'pods_api_pre_save_pod_item_post', 'thalim_decode_custom_simple_entities', 10, 3 );
|
||||
|
||||
function thalim_decode_custom_simple_entities( $pieces, $is_new_item, $id ) {
|
||||
if ( empty( $pieces['fields'] ) ) {
|
||||
return $pieces;
|
||||
}
|
||||
|
||||
foreach ( $pieces['fields'] as $name => $field_data ) {
|
||||
// Ne cibler que les pick « custom-simple » (options en dur via pick_custom).
|
||||
if ( 'pick' !== pods_v( 'type', $field_data ) ) {
|
||||
continue;
|
||||
}
|
||||
if ( 'custom-simple' !== pods_v( 'pick_object', $field_data ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$value = isset( $field_data['value'] ) ? $field_data['value'] : null;
|
||||
if ( null === $value || '' === $value ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$decoded = thalim_html_entity_decode_deep( $value );
|
||||
if ( $decoded !== $value ) {
|
||||
$pieces['fields'][ $name ]['value'] = $decoded;
|
||||
}
|
||||
}
|
||||
|
||||
return $pieces;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pendant côté AFFICHAGE du même bug d'encodage.
|
||||
*
|
||||
* Symptôme : après avoir enregistré « Journée d'étude », le menu de la page
|
||||
* d'édition ré-affiche « -- Sélectionnez -- » alors que la valeur est bien
|
||||
* stockée (la pastille s'affiche sur le post).
|
||||
*
|
||||
* Cause : Pods construit la *valeur* (`id`) de chaque option DFV via
|
||||
* html_entity_decode( esc_html( $id ), ENT_COMPAT ) (PodsField_Pick::
|
||||
* build_dfv_field_item_data_recurse_item). esc_html encode l'apostrophe en
|
||||
* ', mais ENT_COMPAT NE décode PAS les apostrophes → l'option garde la
|
||||
* value « Journée d'étude », qui ne correspond pas à la valeur stockée
|
||||
* brute « Journée d'étude » → le <select> React retombe sur le placeholder.
|
||||
*
|
||||
* Correctif : on redécode les entités des `id` d'options des pick custom-simple
|
||||
* via le filtre `pods_field_dfv_data` (qui reçoit toute la config DFV). La value
|
||||
* de l'option redevient brute et matche la valeur stockée → l'option s'affiche
|
||||
* sélectionnée. Bonus : le DFV soumettra alors la value brute au save.
|
||||
*/
|
||||
add_filter( 'pods_field_dfv_data', 'thalim_decode_custom_simple_dfv_ids', 10, 3 );
|
||||
|
||||
function thalim_decode_custom_simple_dfv_ids( $data, $args, $attributes ) {
|
||||
// $args->options peut être un array OU un objet Field (ArrayAccess) ; pods_v gère les deux.
|
||||
$type = isset( $args->type ) ? $args->type : '';
|
||||
$options = isset( $args->options ) ? $args->options : [];
|
||||
$pick_object = pods_v( 'pick_object', $options );
|
||||
|
||||
if ( 'pick' !== $type || 'custom-simple' !== $pick_object ) {
|
||||
return $data;
|
||||
}
|
||||
if ( empty( $data['fieldItemData'] ) || ! is_array( $data['fieldItemData'] ) ) {
|
||||
return $data;
|
||||
}
|
||||
|
||||
foreach ( $data['fieldItemData'] as $i => $item ) {
|
||||
if ( is_array( $item ) && isset( $item['id'] ) && is_string( $item['id'] ) ) {
|
||||
$data['fieldItemData'][ $i ]['id'] = html_entity_decode( $item['id'], ENT_QUOTES | ENT_HTML5, 'UTF-8' );
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* html_entity_decode récursif (gère string et tableau de strings — un pick
|
||||
* multi-valeur soumet un tableau). ENT_QUOTES pour couvrir ' / ".
|
||||
*/
|
||||
function thalim_html_entity_decode_deep( $value ) {
|
||||
if ( is_array( $value ) ) {
|
||||
return array_map( 'thalim_html_entity_decode_deep', $value );
|
||||
}
|
||||
if ( is_string( $value ) ) {
|
||||
return html_entity_decode( $value, ENT_QUOTES | ENT_HTML5, 'UTF-8' );
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
Reference in New Issue
Block a user