Cum adaugam custom meta field pentru produsele variate din WooCommerce

M-am lovit de aceasta problema acum cateva zile in timp ce lucram la un modul care face conversie din valuta in RON, pentru a obtine asta, aveam nevoie sa adaug la fiecare variatie a produsului doua campuri custom: un select si un text input.

Solutia a fost gasita initial de Remi Corson eu numai o traduc si o explic in limba Romana.

Incepem prin adaugarea a doua functii pe hook-urile oferite de WooCommerce.

Functia care inregistreaza field-urile trebuie sa fie adaugata pe hook-ul „woocommerce_product_after_variable_attributes” si functia care salveaza field-urile va fi adaugata pe hook-ul „woocommerce_save_product_variation”.

Pentru a inregistra un nou field, ne folosim de functiile deja disponibile in WooCommerce:

  • woocommerce_wp_text_input()
  • woocommerce_wp_textarea_input()
  • woocommerce_wp_select()
  • woocommerce_wp_checkbox()
  • woocommerce_wp_hidden_input()

Fiecare input are urmatorii parametri generici:

  • id – Id-ul field-ului, trebuie sa fie unic, in exemplu se adauga id-ul variatiei – string
  • label – Numele field-ului – string
  • desc_tip – bool
  • description – Daca dorim descriere o sa setam „desc_tip” pe true si aici v-om completa descrierea – string
  • value – valoarea actuala a field-ului – string

Salvarea field-urilor se face cu functia update_post_meta(), aici este si codul complet:

[gist id=”289e00a1bc3dcb3b3a26″]


Comments

5 răspunsuri la „Cum adaugam custom meta field pentru produsele variate din WooCommerce”

  1. Avatar George Jipa
    George Jipa

    Inainte de salvarea in DB a optiunilor, as recomanda folosirea sanitize_text_field sau wc_clean (functie inclusa in woocommerce, fiind wrapper pt sanitize_text_field care sa permita sanitizarea elementelor unui array) pt inputs/selects si wp_kses_post pt textareas. Spun asta pentru ca am vazut folosit esc_attr si ar trebui folosit pt output sanitization.

    1. Exista sanitize builtin pe update_post_meta, deci recomandarea ta nu prea e buna, se face esc la output in functie de tipul continutului si locul unde vrei sa-i faci output, dar la input se ocupa wp de tot.

      1. Avatar Robert Hapiuc
        Robert Hapiuc

        Hm…haideti sa vedem
        – update_post_meta observ ca nu are sanitize, a se vedea in wp-inclus/post.php#1733 dar functia update_post_meta cheama functia update_metadata, a se vedea in wp-includes/meta.php#143
        – update_metadata nu are sanitize dar in functie intervine o alta functie la linia 167 care are rol de filtru, ci mai exact sanitize_meta ( https://codex.wordpress.org/Function_Reference/sanitize_meta ), a se vedea in wp-includes/meta.php#925, functia nu face sanitize la nimic, dar te poti folosi de filtru ca sa faci tu sanitize in functie de tipul de informatie pe care il pui in meta.

        Bine ca mi-ati dat idei pentru https://hapiucrobert.ro/2016/01/25/afisezi-timpul-estimativ-citire-unui-articol-blogul/, o sa fac o mica functie care face sanitize la datele mele si o s-o aplic pe respectivul filtru, corect sau incorect?

  2. Avatar George Jipa
    George Jipa

    Sanitizarea unei valori salvate ca post meta… se poate face in 2 feluri:
    1. cum am zis eu (de altfel cred ca este si cea mai raspandita metoda in randul developerilor)
    2. cu filtre (filtru aplicat in functia sanitize_meta)
    Ideea este ca trebuie facuta, ci nu trebuie sa te bazezi c-o face altul pentru tine. Cine nu crede, sa testeze. 😉

  3. Baieti aveti dreptate, eram cu gandu la wp_insert_post, cu care lucrasem foarte recent ( http://wordpress.stackexchange.com/questions/24436/how-safe-sanitized-is-wp-insert-posts?answertab=votes#tab-top ).

    Add / update post meta intr-adevar are nevoie de o extra validare, filtrele de sanitize nefiind pre-initiate by default ca in cazul wp_insert_post.

    Cheers

Sari la conținut