Cum să obții ID-ul unei variații în Woocommerce?

14 ian. 2014, 19:44:48
Vizualizări: 27.1K
Voturi: 3

Încerc să creez o funcționalitate suplimentară în backend-ul Woocommerce unde adaug un câmp personalizat în secțiunea de variații. Cu toate acestea, nu reușesc deloc să obțin ID-ul variației curente pentru a putea accesa post meta.

Iată cu ce am lucrat:

<?php

        // Obține variațiile
        $args = array(
                     'post_type'     => 'product_variation',
                     'post_status'   => array( 'private', 'publish' ),
                     'numberposts'   => -1,
                     'orderby'       => 'menu_order',
                     'order'         => 'asc',
                     'post_parent'   => $post->ID
                 );
                 $variations = get_posts( $args ); 

        foreach ( $variations as $variation ) {

                     $variation_id           = absint( $variation->ID );$variable_id = $this['variation_id'];
                     $variation_post_status  = esc_attr( $variation->post_status );
                     $variation_data         = get_post_meta( $variation_id );
                     $variation_data['variation_post_id'] = $variation_id;
                    echo get_post_meta( $variation_data['variation_post_id'], '_my_custom_field', true) . ' - TEST';

                 }

     ?>

Când verific backend-ul, pare că încarcă toate metadatele în fiecare variație astfel:

descrierea imaginii pentru exemplul de variații

Totuși, dacă folosesc ID-ul real al variației ca mai jos, funcționează pentru acea variație:

echo get_post_meta( 134, '_my_custom_field', true) . ' - Test Variation #134';


ACTUALIZARE:
Iată tot codul în întregime în cazul în care ajută.

// Afișează câmpurile
add_action( 'woocommerce_product_after_variable_attributes', 'variable_fields' );
//JS pentru adăugarea câmpurilor pentru noile variații
add_action( 'woocommerce_product_after_variable_attributes_js', 'variable_fields_js' );
// Salvează câmpurile
add_action( 'woocommerce_process_product_meta_variable', 'variable_fields_process', 10, 1 );

function variable_fields( $loop, $variation_data, $variation ) {
?>  
    <tr>
        <td>
            <div>
                    <label><?php _e( 'Câmpul Meu Personalizat', 'woocommerce' ); ?></label>
                    <input type="text" size="5" name="my_custom_field[<?php echo $loop; ?>]" value="<?php echo $variation_data['_my_custom_field'][0]; ?>"/>

      <?php
      if (isset( $_POST['variable_sku'] ) ) :
        $variable_sku = $_POST['variable_sku'];
        $variable_post_id = $_POST['variable_post_id'];
        $variable_custom_field = $_POST['my_custom_field'];
        for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
            $variation_id = (int) $variable_post_id[$i];
            if ( isset( $variable_custom_field[$i] ) ) {
                update_post_meta( $variation_id, '_my_custom_field', stripslashes( $variable_custom_field[$i] ) );
            }
            echo get_post_meta( $variation_id, '_my_custom_field', true) . ' - Test';
        endfor;
    endif;

        //funcționează echo get_post_meta( 134, '_my_custom_field', true) . ' - Test 134';



     ?>
            </div>
        </td>
    </tr>
<?php
}

function variable_fields_js() {
?>
<tr>
        <td>
            <div>
                    <label><?php _e( 'Câmpul Meu Personalizat', 'woocommerce' ); ?></label>
                    <input type="text" size="5" name="my_custom_field[' + loop + ']" />
            </div>
        </td>
    </tr>
<?php
}

function variable_fields_process( $post_id ) {
    if (isset( $_POST['variable_sku'] ) ) :
        $variable_sku = $_POST['variable_sku'];
        $variable_post_id = $_POST['variable_post_id'];
        $variable_custom_field = $_POST['my_custom_field'];
        for ( $i = 0; $i < sizeof( $variable_sku ); $i++ ) :
            $variation_id = (int) $variable_post_id[$i];
            if ( isset( $variable_custom_field[$i] ) ) {
                update_post_meta( $variation_id, '_my_custom_field', stripslashes( $variable_custom_field[$i] ) );
            }
        endfor;
    endif;
}
Comentarii

care este contextul? în ce poziție ai nevoie să obții variation_id? pentru a adăuga câmpul tău, folosești hook-ul woocommerce_product_after_variable_attributes sau ce anume?

Shazzad Shazzad
15 ian. 2014 02:49:37

Mulțumesc @Shazzad, am actualizat întrebarea pentru a afișa codul meu complet, da, foloseam acel hook. Mulțumesc pentru ajutor

Derek Derek
15 ian. 2014 16:24:28

Al treilea argument $variation este un obiect post care conține ID-ul, de exemplu $variation->ID. Altfel, array-ul $variation_data are și el ID-ul $variation_data['variation_post_id']. Și pentru actualizarea valorilor în meta, poți folosi hook-ul woocommerce_save_product_variation, care vine cu două argumente $$variation_id, $i (cheie/index număr)

Shazzad Shazzad
15 ian. 2014 23:57:33

Când încerc să schimb get_post_meta în $variation->ID, nu obțin nimic afișat pe pagina de editare a produsului în admin. Ai putea, te rog, să postezi un exemplu (învăț mai bine vizual) unde pot vedea și testa?

Derek Derek
16 ian. 2014 04:17:03

Bine, o voi face, dar sunt puțin confuz în legătură cu ce încerci să realizezi? Poți, te rog, să explici ca să încerc să îți explic?

Shazzad Shazzad
16 ian. 2014 07:35:41

Tot ce am nevoie este o modalitate de a obține ID-ul variației când folosesc funcția get_post_meta. După cum vezi în captura de ecran, am o casetă meta personalizată în partea de jos a fiecărei variații unde cineva va introduce niște informații. Datele se salvează în baza de date fără probleme, dar obținerea ID-ului variației pentru get_post_meta pare să fie problema mea. În prezent, dacă tastezi ceva în oricare dintre acele casete și apeși "Actualizează", atunci se salvează, dar nu arată datele salvate în caseta de text, așa cum se vede în captura de ecran de mai sus. De exemplu, am tastat "opiolik" în caseta meta a primei variații și am folosit "qefqe" pentru a doua casetă meta.

Derek Derek
16 ian. 2014 15:13:21

Deci problema mea constă în faptul că $variation_id nu preia corect ID-ul variației în 'echo get_post_meta( $variation_id, '_my_custom_field', true) . ' - Test';', ci afișează toate metadatele variațiilor, așa cum se vede în captura de ecran pentru fiecare. Dacă folosesc ceva de genul 'echo get_post_meta( 134, '_my_custom_field', true) . ' - Test';', atunci funcționează și afișează metadatele _my_custom_field pentru variația #134.. Sper să nu vă fi confuzat. Pe scurt, am nevoie doar de o modalitate de a afișa datele introduse după ce se apasă pe actualizare. (Datele se salvează în baza de date, dar nu se afișează la reîncărcarea paginii)

Derek Derek
16 ian. 2014 15:17:11

Te rog să încerci odată cu asta - <input type="text" size="5" name="my_custom_field[<?php echo $loop; ?>]" value="<?php echo get_post_meta( $variation->ID, '_my_custom_field', true ); ?>"/>

Shazzad Shazzad
17 ian. 2014 00:27:22

Hmm, nici asta nu a funcționat.. Am introdus informații în caseta text și am dat click pe salvare, dar tot nu apar? Mai ai alte sugestii? (PS Mulțumesc mult pentru ajutorul acordat)

Derek Derek
17 ian. 2014 02:36:59

Vă rugăm să evitați discuțiile prelungite în comentarii. Dacă trebuie să clarificați ceva, trimiteți o [editare] în loc de un comentariu. @Shazzad Dacă credeți că aveți o soluție, vă rugăm să o postați ca răspuns, nu ca comentariu. Mulțumesc.

kaiser kaiser
10 feb. 2014 20:23:34
Arată celelalte 5 comentarii