Supporto » Sviluppare con WordPress » Funzione personalizzata Advanced Custom Fields

  • Risolto RapaFenice

    (@rapafenice)


    Ciao a tutti, sto cercando di creare uno shortcode che richiami una funzione di selezione degli utenti, con filtro su un custom field di ACF.
    Ci sono quasi, ma non capisco come mai non funzioni.
    Allora..semplifico la funzione, ovviamente, perché non serve scriverla tutta. Se faccio così:

    $clienti = get_users(array(
    
    'meta_key' => 'stato',
    'meta_value' => 'Italia'
    ));
    
    // Array of WP_User objects.
    
    foreach ( $clienti as $user ) {
    
    $stato = get_field('stato', $user);
    
    echo '<div>' . $stato . '</div>';
    
    }

    FUNZIONA, cioè mi scrive lo stato correttamente.

    …se faccio invece così:

    
    function punti_vendita ($stato){
    
    $clienti = get_users(array(
    
    'meta_key' => 'stato',
    'meta_value' => '$stato'
    ));
    
    // Array of WP_User objects.
    
    foreach ( $clienti as $user ) {
    
    $stato = get_field('stato', $user);
    
    echo '<div>' . $stato . '</div>';
    
    }
    }
    
    punti_vendita ("Italia");

    NON FUNZIONA. Ovvero non scrive nulla se richiamo la funzione. In particolare, ho scritto la funzione in functions.php e l’ho richiamata in un template. Ma anche scrivendo la funzione nel template e richiamandola nello stesso, non scrive lo stesso.
    Ho provato a cambiare l’echo in return e non cambia nulla.
    Il passaggio successivo sarebbe trasformare il tutto in uno shortcode della serie: [punti_vendita stato=”Italia”], oppure [punti_vendita stato=”Germania”], etc.

    Chi mi sa aiutare??
    Grazie mille!
    Ylenia

Stai visualizzando 6 risposte - dal 1 al 6 (di 6 totali)
  • Chi ha creato la discussione RapaFenice

    (@rapafenice)

    Ecco come vorrei fosse il codice finale in functions.php. Ma non va. Non mi spiego perché, dato che il cuore della funzione funge 🙁

    add_shortcode("punti_vendita", "punti_vendita");
    
    function punti_vendita ($atts){
        extract(shortcode_atts(array(
        'stato' => 200
        ), $atts));
    
        $clienti = get_users(array(
    
    	'meta_key'	=> 'stato',
    	'meta_value'	=> '$stato'
    ));
    
    // Array of WP_User objects.
    
        foreach ( $clienti as $user ) {
    
        $state = get_field('stato', $user);
    
        return '<div>' . $state . '</div>';
    
    }
    }

    Lo shortcode che ho provato ad inserire nella pagina è questo: [punti_vendita stato=”Italia”].

    Se metto un
    return $stato;
    prima del foreach, FUNZIONA, cioè suppongo riceva il parametro dallo shortcode in modo corretto.

    Grazie ancora!

    Chi ha creato la discussione RapaFenice

    (@rapafenice)

    Allora ragazzi. Sto faticosamente andando avanti a pezzettini. Questa modifica sembra quasi funzionare:

    add_shortcode("punti_vendita", "punti_vendita");
    
    function punti_vendita ($atts){
        extract(shortcode_atts(array(
        'provincia' => 200
        ), $atts));
    
        $clienti = get_users(array(
        'offset' => 1,
        'number' => 30,
    	'meta_key'		=> 'provincia',
    	'meta_value'	=> $provincia
    ));
    
    // Array of WP_User objects.
    
        foreach ( $clienti as $user ) {
    
        $stato = get_field('stato', $user);
        $regione = get_field('regione', $user);
        $provincia = get_field('provincia', $user);
        $email = get_field('email', $user);
        $sitoweb = get_field('sito_web', $user);
        $ragione_sociale = get_field('ragione_sociale', $user);
        $indirizzo = get_field('indirizzo', $user);
        $provincia = get_field('provincia', $user);
        $tel = get_field('tel', $user);
        $fax = get_field('fax', $user);
        $gallery = get_field('gallery', $user);
    
        return '<div><b>Name: ' . $ragione_sociale . '</b>
        </div> <div><b>Address:</b> ' . $indirizzo . ' - <b> (' . $provincia . ')</b></div>
        <div><b>Tel:</b> ' . $tel . ' <b>Fax:</b> ' . $fax. '</div>
        <div><b>Email: </b><a href="mailto:' . $email . '">' . $email . '</a></div>
        <div><b>Web: </b><a href="' . $sitoweb . '">' . $sitoweb . '</a></div><br /> <hr>';
    
        }
    }

    Lo shortcode restiruisce quasi quello che dovrebbe restituire. Dico quasi perché restituisce 1 solo elemento.
    Per farvi un esempio. Ho 3 utenti che hanno come Provincia Pescara, ma se scrivo [punti vendita provincia=”Pescara”, me ne viene elencato sempre e solo 1.
    Come mai?

    Grazie ancora!!

    Chi ha creato la discussione RapaFenice

    (@rapafenice)

    Scusate se continuo a scrivere post, ma non ho un tasto per editare i precedenti 🙁
    O almeno non lo vedo.

    Volevo aggiungere che credo di aver capito che sia return il problema, che esce dal loop. Però ho dovuto evitare di utilizzare echo, in quanto mi impediva di inserire lo shortcode annidato in altri shortcode, che è indispensabile per quello che so facendo.
    Se metto echo, funziona benissimo ma non mi fa inserire il testo dove dico io.

    Avete soluzioni? Grazie!

    Ciao,
    hai colto il punto: return ti fa uscire dal loop.
    Quello che ti serve quindi è “collezionare” nel loop tutto l’html da restituire, e restituirlo al di fuori del loop.
    Ti consiglierei di provare questo:
    1) dichiara una variable $html prima del loop e assegnale '' (stringa vuota)
    $html = '';
    2) all’interno del loop, sostituisci quel return con $html.= (che è l’equivalente di $html = $html . – cioè, al precedente contenuto della string $html aggiungi altro contenuto e assegna tutto ad $html)

    $html .= '<div><b>Name: ' . $ragione_sociale . '</b>
        </div> <div><b>Address:</b> ' . $indirizzo . ' - <b> (' . $provincia . ')</b></div>
        <div><b>Tel:</b> ' . $tel . ' <b>Fax:</b> ' . $fax. '</div>
        <div><b>Email: </b><a href="mailto:' . $email . '">' . $email . '</a></div>
        <div><b>Web: </b><a href="' . $sitoweb . '">' . $sitoweb . '</a></div><br /> <hr>';

    3) ora al termine del loop puoi restituire $html

    ...mailto:' . $email . '">' . $email . '</a></div>
        <div><b>Web: </b><a href="' . $sitoweb . '">' . $sitoweb . '</a></div><br /> <hr>';
    
        }
        return $html;
    }

    Spero di sia d’aiuto.

    Rocco

    Chi ha creato la discussione RapaFenice

    (@rapafenice)

    @d4z_c0nf non so osa dirti, Rocco, se non un grazie grande come una casa e mezza.
    Tutto ciò che mi serviva in 3 secondi. Perfetto.

    Ci avevo anche pensato ma dato che tutto sono tranne che super esperta in coding, mi mancava quel $html.=
    Geniale.
    Grazie ancora!

    Sono contento di esserti stato d’aiuto.
    Comunque puoi anche usare
    $html = $html . '... ... ';
    😉

    In bocca al lupo per il tuo progetto.

    Rocco

Stai visualizzando 6 risposte - dal 1 al 6 (di 6 totali)
  • Il topic ‘Funzione personalizzata Advanced Custom Fields’ è chiuso a nuove risposte.