Para las casillas de verificación, debes usar sanitize_key()
en cambio, los valores de las casillas de verificación suelen ser valores simples de activación/desactivación. Esta es la forma correcta de desinfectar una casilla de verificación en la metaactualización del usuario:
update_user_meta( $user_id, '6_checkbox', sanitize_key( $_POST['6_checkbox'] ) );
Esto funciona mejor porque sanitize_key() está diseñado para valores simples y:
- Convertir a minúsculas
- Eliminar todos los caracteres no alfanuméricos
- Perfecto para valores de casillas de verificación que normalmente son ‘1’, ‘activados’ o vacíos
Desafortunadamente, la casilla de verificación no permanece marcada después de guardar el trabajo…
Según los estándares de codificación de WordPress, esta sería al menos la ortografía correcta:
if( isset( $_POST['6_checkbox'] ) ) {
update_user_meta( $user_id, '6_checkbox', absint( wp_unslash( $_POST['6_checkbox'] ) ) );
}
else {
delete_user_meta( $user_id, '6_checkbox' );
}
Fondo:
Siempre es necesario comprobar si hay una variable configurada en la solicitud.
Siempre es necesario proteger los valores entrantes con wp_unslash().
Definitivamente recomendaría usar un valor numérico para las casillas de verificación (no hay sí/no como valor), por lo que también definitivamente recomendaría asegurar el valor entrante con absint().
El código anterior no ha sido probado por mí, pero sería sintácticamente correcto. Si esto no funciona para usted, verifique mediante depuración (por ejemplo, con var_dump() y salga;) si la casilla de verificación con este nombre existe en la solicitud. Esto puede indicarle por qué no se guarda.
Cambié algo en mi html
ID ) ); ?>" class="regular-price" />
y usado
if( isset( $_POST['6'] ) ) {
update_user_meta( $user_id, '6', absint( wp_unslash( $_POST['6'] ) ) );
}
else {
delete_user_meta( $user_id, '6' );
}
pero no funciona
Esto tampoco es posible por varias razones:
- Los ID que comienzan con números y consisten únicamente en estos no están permitidos en HTML. Cambie el nombre del ID y del atributo de nombre, por ejemplo, a ‘campo_6’.
- Su atributo de valor tiene el valor «sí» y no solo un «1» como pretendía anteriormente. Si desea seguir con esto, debe adaptar el almacenamiento y desinfectar un valor de cadena, es decir:
update_user_meta( $user_id, '6', sanitize_text_field( wp_unslash( $_POST['field_6'] ) ) );
- Su HTML aún es incorrecto. Simplemente desea generar el valor almacenado del campo, pero esto no hace nada (simplemente imprimiría «sí», que no significa nada en HTML). En HTML, las casillas de verificación con el atributo marcado están marcadas como
checked
. Consulte Conceptos básicos: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox; además, tiene una comilla doble adicional después de este resultado, lo que significa que todo el código HTML ya no es válido y puede dar lugar a una salida incorrecta.
Por lo tanto, deberá adaptar su código HTML en consecuencia:
ID, '6' ) ? ' checked' : '' ); ?> class="regular-price" />
ok, lo hice
ID ) ); ?>" class="regular-price" />
y
if( isset( $_POST['checkbox_6'] ) ) {
update_user_meta( $user_id, 'checkbox_6', absint( wp_unslash( $_POST['checkbox_6'] ) ) );
}
else {
delete_user_meta( $user_id, 'checkbox_6' );
}
el primer código está dentro de un código más largo, puedo ver correctamente la casilla de verificación, pero tampoco esta combinación funciona
El PHP dentro de su campo de entrada no logra lo que desea. Probablemente necesites hacer eco condicionalmente checked
¿Solo cuando el meta del usuario existe? Podrías usar una construcción ternaria para esto:ID )) ? '' : ' checked'; ?>
Debido a que el valor de la casilla de verificación es “checkbox_6”, cuando se ejecuta el código de actualización/eliminación, $_POST[‘checkbox_6’] tendrá ese valor. Por tanto, no tiene sentido utilizar absint() en tal caso. Para usar absint(), el valor de la casilla de verificación debe ser 1
.
Por favor, también eche otro vistazo a mi respuesta. Obviamente no has implementado ninguno de los consejos hasta ahora.
la cita en ?>" class=
no pertenece, por favor elimínelo.
En lugar de eliminar el metarregistro del usuario cuando la casilla no está marcada, recomiendo actualizar el registro para false
o 0
.
Cuando basa el estado de la casilla de verificación (marcada o no marcada) con get_the_author_meta(), debido a una condición de carrera, es posible que el estado no se refleje cuando se envía y recarga el formulario. Para que la casilla de verificación refleje el estado deseado, debe basar la falta de la checked
atributo en el meta del autor O el $_POST[‘checkbox_6’] el valor está vacío.
La casilla de verificación ahora permanece marcada, pero ¿cómo puedo traducir en código tu consejo? De hecho, tengo un problema relacionado aquí en este tema: https://wordpress.org/support/topic/adding-a-conditional-if-a-check-box-is-checked/ que parece confirmar lo que estabas diciendo el sistema no es sensible al cambio de estado cuando marco o desmarco y guardo
Mi pensamiento fue este:ID )) || empty( $_POST[‘checkbox_6’]) ? '' : ' checked'; ?>
Aunque no probado. Tengo problemas con la lógica negativa compuesta. Puede ser que necesitemos &&
en lugar de ||
. Pruebe ambos, vea cuál funciona mejor 🙂
No es que no sea sensato cambiar el sistema, es más bien que el sistema no puede guardar y luego recuperar el valor deseado lo suficientemente rápido. PHP se ejecuta más rápido de lo que la base de datos puede escribir datos. Es lo que los programadores llaman condición de carrera. Con el código existente sin la lógica adicional, incluso si la casilla de verificación no refleja inicialmente la elección correcta, si recarga la página, se mostrará la elección correcta porque la base de datos ha tenido tiempo de escribir la selección.
¿Quizás con la nueva cadena anterior tengo que cambiar el código de desinfección/guardado? El actual ya no funciona, ahora tengo
update_user_meta( $user_id, 'checkbox_6', sanitize_key( $_POST['checkbox_6'] ) );