[Resuelto] Ayuda Con Php Y Acf (Plugin De Wordpress)

  • Autor Autor samuelsuteras
  • Fecha de inicio Fecha de inicio
samuelsuteras

samuelsuteras

Épsilon
Verificación en dos pasos activada
Verificado por Whatsapp
Verificado por Binance
Hola chicos,

No estaba seguro en que seccion publicar este tema, si en wordpress plugins o acá pero en más PHP related que otra cosa, estoy intentando agregar un custom field al edit account de woocommerce, este custom field lo mejor es que sea con ACF - advanced custom fields ya que de esta manera lo puedo conectar con un api y un app que estoy haciendo, soy bastante noob en cuanto a php en el frontend tal vez los dioses @fabgonber y @YeltsinReyes me puedan echar una mano como el otro dia jajaja.


Quiero mostrar 3 checkboxes donde el usuario tenga que marcar uno para seleccionar que opcion quiere.

Por ejemplo:

Como le gustaria que le contactemos?

Opcion 1: Telefono
Opcion 2: Email
Opcion 3: Mediante un cuervo

Solo puede seleccionar una, yo se como mostrar el custom field en el edit account de woocommerce el problema es que intento mostrar el field que he creado con advanced custom field y no me aparece, estoy haciendo el get_field('nombre-campo').

Alguien tiene alguna idea de como pueda lograr eso?

dejo el codigo que tengo
Insertar CODE, HTML o PHP:
// the hooks to make it all work
add_action( 'init', 'my_init' );
add_filter('woocommerce_registration_redirect', 'wc_registration_redirect');
add_filter('wp_authenticate_user', 'wp_authenticate_user',10,2);
add_action('user_register', 'my_user_register',10,2);


add_action( 'woocommerce_edit_account_form', 'add_contact_preference_to_edit_account_form' );
function add_contact_preference_to_edit_account_form() {
    $user = wp_get_current_user();
    ?>
        <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
        <label for="contact_preference"><?php _e( 'Favorite color', 'woocommerce' ); ?></label>
            <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr( $user->contact_preference ); ?>"> JavaScript <br/>
            <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr( $user->contact_preference ); ?>"> jQuery <br/>
            <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr( $user->contact_preference ); ?>"> Angular JS <br/>

    </p>
    <?php
}

// Save the custom field 'contact_preference' 
add_action( 'woocommerce_save_account_details', 'save_contact_preference_account_details', 12, 1 );
function save_contact_preference_account_details( $user_id ) {
    // For Favorite color
    if( isset( $_POST['contact_preference'] ) )
        update_user_meta( $user_id, 'contact_preference', sanitize_text_field( $_POST['contact_preference'] ) );
        echo var_dump($user_id->contact_preference);

    // For Billing email (added related to your comment)
    if( isset( $_POST['account_email'] ) )
        update_user_meta( $user_id, 'billing_email', sanitize_text_field( $_POST['account_email'] ) );
}


En vez de ese input me gustaria mostrar las 3 opciones y poder guardar la seleccionada pero soy un noob en php con frontend, algun alma generosa que me pueda tirar una monedita?
 
Última edición:
@samuelsuteras dices mostrar los checkbox ?
Quiero mostrar unos radio buttons bro, para que el usuario solo pueda seleccionar una opcion, ademas lo quiero hacer con ACF porque me da la opcion de mostrarlo de una vez en el backend del usuario sin hacer mucho más, pero no se como llamar al field desde el functions.php
 
Quiero mostrar unos radio buttons bro, para que el usuario solo pueda seleccionar una opcion, ademas lo quiero hacer con ACF porque me da la opcion de mostrarlo de una vez en el backend del usuario sin hacer mucho más, pero no se como llamar al field desde el functions.php
El field se llama como dices get_field('nombre-campo') pero veo que ya tienes
update_user_meta() que puedes usarlo y llamarlo con get_user_meta()
 
El field se llama como dices get_field('nombre-campo') pero veo que ya tienes
update_user_meta() que puedes usarlo y llamarlo con get_user_meta()
Y como podria pasar el valor seleccionado de los radio buttons?
 
Insertar CODE, HTML o PHP:
// the hooks to make it all work
add_action( 'init', 'my_init' );
add_filter('woocommerce_registration_redirect', 'wc_registration_redirect');
add_filter('wp_authenticate_user', 'wp_authenticate_user',10,2);
add_action('user_register', 'my_user_register',10,2);


add_action( 'woocommerce_edit_account_form', 'add_contact_preference_to_edit_account_form' );
function add_contact_preference_to_edit_account_form() {
    $user = wp_get_current_user();
    ?>
        <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
        <label for="contact_preference"><?php _e( 'Favorite color', 'woocommerce' ); ?></label>
            <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr( $user->contact_preference ); ?>"> JavaScript <br/>
            <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr( $user->contact_preference ); ?>"> jQuery <br/>
            <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr( $user->contact_preference ); ?>"> Angular JS <br/>

    </p>
    <?php
}

// Save the custom field 'contact_preference'
add_action( 'woocommerce_save_account_details', 'save_contact_preference_account_details', 12, 1 );
function save_contact_preference_account_details( $user_id ) {
    // For Favorite color
    if( isset( $_POST['contact_preference'] ) )
        update_user_meta( $user_id, 'contact_preference', sanitize_text_field( $_POST['contact_preference'] ) );

    // For Billing email (added related to your comment)
    if( isset( $_POST['account_email'] ) )
        update_user_meta( $user_id, 'billing_email', sanitize_text_field( $_POST['account_email'] ) );
}
Mi codigo lo tengo asi ahora (ya no se que mas probar)
 
@samuelsuteras A tu codigo le agregue otros input de ejemplo.
PHP:
add_action( 'init', 'my_init' );
add_filter('woocommerce_registration_redirect', 'wc_registration_redirect');
add_filter('wp_authenticate_user', 'wp_authenticate_user',10,2);
add_action('user_register', 'my_user_register',10,2);


add_action('woocommerce_edit_account_form', 'add_contact_preference_to_edit_account_form');
function add_contact_preference_to_edit_account_form(){
    $user = wp_get_current_user(); ?>
    
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
        <label for="contact_preference"><?php _e( 'Favorite color', 'woocommerce' ); ?></label>
        <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr($user->contact_preference); ?>"> JavaScript <br/>
        <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr($user->contact_preference); ?>"> jQuery <br/>
        <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr($user->contact_preference); ?>"> Angular JS <br/>
    </p>
    
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
        <label for="forma_de_contacto"><?php _e( 'Forma de contacto', 'woocommerce' ); ?></label>
        <input type="radio" name="forma_de_contacto" id="forma_de_contacto" value="<?php echo esc_attr($user->forma_de_contacto); ?>"> Telefono <br/>
        <input type="radio" name="forma_de_contacto" id="forma_de_contacto" value="<?php echo esc_attr($user->forma_de_contacto); ?>"> Email <br/>
    </p>
    
    <?php
}

// Save the custom field 'contact_preference'
add_action( 'woocommerce_save_account_details', 'save_contact_preference_account_details', 12, 1 );
function save_contact_preference_account_details($user_id){
    
    if(isset($_POST['contact_preference'])){
        update_user_meta( $user_id, 'contact_preference', sanitize_text_field($_POST['contact_preference']));
    }
    
    if(isset($_POST['forma_de_contacto'])){
        update_user_meta($user_id, 'forma_de_contacto', sanitize_text_field($_POST['forma_de_contacto']));
    }

    if(isset($_POST['account_email'])){
        update_user_meta( $user_id, 'billing_email', sanitize_text_field($_POST['account_email']));
    }
}
 
@samuelsuteras A tu codigo le agregue otros input de ejemplo.
PHP:
add_action( 'init', 'my_init' );
add_filter('woocommerce_registration_redirect', 'wc_registration_redirect');
add_filter('wp_authenticate_user', 'wp_authenticate_user',10,2);
add_action('user_register', 'my_user_register',10,2);


add_action('woocommerce_edit_account_form', 'add_contact_preference_to_edit_account_form');
function add_contact_preference_to_edit_account_form(){
    $user = wp_get_current_user(); ?>
   
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
        <label for="contact_preference"><?php _e( 'Favorite color', 'woocommerce' ); ?></label>
        <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr($user->contact_preference); ?>"> JavaScript <br/>
        <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr($user->contact_preference); ?>"> jQuery <br/>
        <input type="radio" name="contact_preference" id="contact_preference" value="<?php echo esc_attr($user->contact_preference); ?>"> Angular JS <br/>
    </p>
   
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
        <label for="forma_de_contacto"><?php _e( 'Forma de contacto', 'woocommerce' ); ?></label>
        <input type="radio" name="forma_de_contacto" id="forma_de_contacto" value="<?php echo esc_attr($user->forma_de_contacto); ?>"> Telefono <br/>
        <input type="radio" name="forma_de_contacto" id="forma_de_contacto" value="<?php echo esc_attr($user->forma_de_contacto); ?>"> Email <br/>
    </p>
   
    <?php
}

// Save the custom field 'contact_preference'
add_action( 'woocommerce_save_account_details', 'save_contact_preference_account_details', 12, 1 );
function save_contact_preference_account_details($user_id){
   
    if(isset($_POST['contact_preference'])){
        update_user_meta( $user_id, 'contact_preference', sanitize_text_field($_POST['contact_preference']));
    }
   
    if(isset($_POST['forma_de_contacto'])){
        update_user_meta($user_id, 'forma_de_contacto', sanitize_text_field($_POST['forma_de_contacto']));
    }

    if(isset($_POST['account_email'])){
        update_user_meta( $user_id, 'billing_email', sanitize_text_field($_POST['account_email']));
    }
}
Gracias

No hay una forma de hacer esto con ACF? Porque mira lo que hace el ACF automaticamente.

1622583013384.webp


No tengo idea como podria mostrar el radio button seleccionado aqui en el backend, a veces odio wordpress jajaja
 
@samuelsuteras ya no entiendo xd, no salen los inputs?


Normalmente con ACF lo que uno hace es crear un input y dentro del loop de wordpress estos inputs pueden ser llamados con echo get_field('nombre-input'), pero cuando está afuera del loop como en este caso (dentro del edit account de woocommerce) estos no aparecen llamandolos asi, o al menos no se como y ya llevo 2 horas googleando y probando y nada.

Entonces opte por almacenar el dato de forma tradicional con PHP (ahi entraste tu a salvarme la vida) pero quiero que sea posible ver que cosa selecciono el usuario en la parte del backend donde ves los datos del usuario (utlimo screenshot)
 
Normalmente con ACF lo que uno hace es crear un input y dentro del loop de wordpress estos inputs pueden ser llamados con echo get_field('nombre-input'), pero cuando está afuera del loop como en este caso (dentro del edit account de woocommerce) estos no aparecen llamandolos asi, o al menos no se como y ya llevo 2 horas googleando y probando y nada.

Entonces opte por almacenar el dato de forma tradicional con PHP (ahi entraste tu a salvarme la vida) pero quiero que sea posible ver que cosa selecciono el usuario en la parte del backend donde ves los datos del usuario (utlimo screenshot)
Si usaste el codigo que te puse para mostrarlo el valor seria.
PHP:
$user = wp_get_current_user();
get_user_meta($user->ID, 'forma_de_contacto');
 
Si usaste el codigo que te puse para mostrarlo el valor seria.
PHP:
$user = wp_get_current_user();
get_user_meta($user->ID, 'forma_de_contacto');
Eso hice.

Entonces esto deberia estar en la misma funcion que guarda los datos?


user = wp_get_current_user();
get_user_meta($user->ID, 'forma_de_contacto');
 
Eso hice.

Entonces esto deberia estar en la misma funcion que guarda los datos?


user = wp_get_current_user();
get_user_meta($user->ID, 'forma_de_contacto');
Esa seria para mostrar el valor, la función que guarda los datos es esta.
PHP:
add_action( 'woocommerce_save_account_details', 'save_contact_preference_account_details', 12, 1 );
function save_contact_preference_account_details($user_id){
    
    if(isset($_POST['contact_preference'])){
        update_user_meta( $user_id, 'contact_preference', sanitize_text_field($_POST['contact_preference']));
    }
    
    if(isset($_POST['forma_de_contacto'])){
        update_user_meta($user_id, 'forma_de_contacto', sanitize_text_field($_POST['forma_de_contacto']));
    }

    if(isset($_POST['account_email'])){
        update_user_meta( $user_id, 'billing_email', sanitize_text_field($_POST['account_email']));
    }
}
 
Si si, eso lo entiendo pero como puedo mostrar el valor en el backend de woocommerce? es decir aqui.

1622584846276.webp

Esta es la parte que me ha tenidod jodido por las ultimas dos horas
 
@samuelsuteras prueba asi, nunca eh usado woocommerce XD
PHP:
<?php $user = wp_get_current_user(); ?>
<input value="<?php echo get_user_meta($user->ID, 'forma_de_contacto'); ?>">
 
Gracias por la ayuda bro! lo voy a intentar
 
Si a alguien le sirve en el futuro aqui está como resolvi gracias a la ayuda de @YeltsinReyes y un extra dde google.


Insertar CODE, HTML o PHP:
add_action('woocommerce_edit_account_form', 'add_contact_preference_to_edit_account_form');
function add_contact_preference_to_edit_account_form(){
    $user = wp_get_current_user();

    $contactPreference = get_user_meta($user->ID,"contact_preference",true);
    print_r($contactPreference);
?>
  
    
    <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
        <input type="radio" name="contact_preference" id="contactpreference_phonechat" value="phonechat" <?php echo  $contactPreference=="phonechat" ? "checked" : ""; ?> />
        <label for="contactpreference_phonechat">By Phone and Chat messages on Alternativa app -recommended </label>
        <input type="radio" name="contact_preference" id="contactpreference_phoneonly" value="phoneonly" <?php echo  $contactPreference=="phoneonly" ? "checked" : ""; ?>/>
        <label for="contactpreference_phoneonly"> Only by Phone </label>
        <input type="radio" name="contact_preference" id="contactpreference_chatonly" value="chatonly" <?php echo  $contactPreference=="chatonly" ? "checked" : ""; ?>/>
        <label for="contactpreference_chatonly"> Only by messages on the alternativa app chat </label>
    </p>
    
    <?php
}

// Save the custom field 'contact_preference'
add_action( 'woocommerce_save_account_details', 'save_contact_preference_account_details', 12, 1 );
function save_contact_preference_account_details($user_id){
  
    if(isset($_POST['contact_preference'])){
        update_user_meta($user_id, 'contact_preference', sanitize_text_field($_POST['contact_preference']));
    }

    if(isset($_POST['account_email'])){
        update_user_meta( $user_id, 'billing_email', sanitize_text_field($_POST['account_email']));
    }
}

// Showing user data in user backend

//add columns to User panel list page
function add_user_columns($column) {
    $column['contact_preference_c'] = 'Contact Preference';

    return $column;
}
add_filter( 'manage_users_columns', 'add_user_columns' );

//add the data
function add_user_column_data( $val, $column_name, $user_id ) {
    $user = get_userdata($user_id);

    switch ($column_name) {
        case 'contact_preference_c' :
            return $user->contact_preference;
            break;
        default:
    }
    return;
}
add_filter( 'manage_users_custom_column', 'add_user_column_data', 10, 3 );
 
Atrás
Arriba