2016-04-21 29 views
1

私のウェブサイトはwordpress、 "events calendar"プラグイン、 "woocommerce"を使用しており、 "Advanced Access Manager"プラグインで役割と機能を管理しています。商品カテゴリに基づいて顧客に機能を追加

購入したばかりの商品カテゴリに基づいて購入者の役割に機能を追加する機能を追加しようとしています。

(ちょうど買った)またはユーザーIDのイベントカテゴリを取得しようとしましたが、何かがうまくいかず、プロセスを完了する必要があるため、段階的にテストすることはほとんど不可能です関数は機能します。ここで

は、コードは次のとおりです。

add_action('woocommerce_payment_complete', 'custom_process_order', 10, 1); 

function custom_process_order($order_id) { 
    $order = new WC_Order($order_id); 
    $myuser_id = (int)$order->user_id; 
    $user_info = get_userdata($myuser_id); 
    $items = $order->get_items(); 

    // need to test that : 

    $beta= str_replace(
     ':', 
     '', 
     tribe_get_event_categories($event->ID, array(
      'echo'   => false, 
      'label'  => '', 
      ' label_before' => '', 
      'label_after' => '', 
      'wrap_before' => '', 
      'wrap_after' => '', 
    ))); 
    $beta = strip_tags($beta); 

    foreach ($items as $item) { 

     //check if user already have capabilitie 
     if (! user_can($user_id, $capability)){ 

      //add capability to specific user 
      $user = new WP_User($user_id); 
      $user->add_cap($beta); 
     } 
    } 
    return $order_id; 
} 

だから例えば、顧客は、カテゴリ「course_paris_night」で製品を購入し、それは役割機能「course_paris_night」を持っている必要があります。この機能を使用すると、この顧客は例で同じカテゴリのチュートリアルにアクセスします。

コードやテスト方法についてお問い合わせいただきありがとうございます。 (学ぶ必要があります)

SO !!! 4月24日...数日後:

add_action('woocommerce_payment_complete', 'custom_process_order', 10, 1); 

function custom_process_order($order_id) { 
    global $current_user; 
    global $wp_roles; 

    $order = new WC_Order($item->ID); 

    $order->populate($item);   
    $items = $order->get_items(); 

    foreach ($items as $key => $item2) : 
     $event_id_in_product = absint($item2['product_id']); 
    endforeach; 

    // trouve la catégorie du produit acheté par le stagiaire 
    // Get all terms associated with post in woocommerce's taxonomy 'product_cat' 
    $terms = get_the_terms($event_id_in_product, 'product_cat'); 

    //Get an array of their IDs 
    $term_ids = wp_list_pluck($terms,'term_id'); 

    //Get array of parents - 0 is not a parent 
    $parents = array_filter(wp_list_pluck($terms,'parent')); 

    //Get array of IDs of terms which are not parents. 
    $term_ids_not_parents = array_diff($term_ids, $parents); 

    //Get corresponding term objects. 
    $terms_not_parents = array_intersect_key($terms, $term_ids_not_parents); 

    //Extract the name of the category from the array and post it. 
    foreach($terms_not_parents as $term_not_parent){ 
     $beta = $term_not_parent->name; 

     $alpha = strip_tags($beta); 
     $alpha = trim(strip_tags($alpha)); 
     $alpha = str_replace(' - ',' ',$alpha); 
     $alpha = strtolower($alpha); 


     $all_roles = $wp_roles->roles; 
     $user = new WP_User($current_user->ID); 
     $result = $user->add_role($alpha); 

     return $order_id; 
    } 
} 

しかし、私は良い結果は得られません。だからここに、それは私が得るものです再びテストするユーザ情報を持っています

WP_User Object 
(
[data] => stdClass Object 
    (
     [ID] => 50 
     [user_login] => buyer.new 
     [user_pass] => $P$BKlx7.CzfvnLL43EZaZdmo84shZQo41 
     [user_nicename] => buyer-new 
     [user_email] => [email protected] 
     [user_url] => 
     [user_registered] => 2016-04-23 22:05:27 
     [user_activation_key] => 
     [user_status] => 0 
     [display_name] => New 
    ) 

[ID] => 50 
[caps] => Array 
    (
     [mycourse saint-malo intermédiaire] => 1 
     [mycourse paris avancé] => 1 
    ) 

[cap_key] => lep_capabilities 
[roles] => Array 
    (
     [0] => mycourse saint-malo intermédiaire 
    ) 

[allcaps] => Array 
    (
     [read] => 1 
     [level_0] => 1 
     [read_private_tribe_organizers] => 1 
     [mycourse saint-malo intermédiaire] => 1 
     [mycourse paris avancé] => 1 
    ) 

[filter] => 
) 

はNormaly私は[」の下に持っている必要があり、私のユーザーは、カテゴリ「mycourseサンマロintermédiaire」と「mycourseパリアヴァンセ」の下に二つの新しいコースを買っていた持っていますroles] => Array "という2つの新しい役割を持っていますが、そうではないことがわかります。

私のコードでは、2つの新しい役割が[caps]と[allcaps]に追加されますが、[roles]には追加されません!!!!

私は非常に近いと確信しています。何か案が ?

//更新日//

申し訳ありません

add_action('woocommerce_payment_complete', 'custom_process_order', 10, 1); 

function custom_process_order($order_id) { 
    global $current_user; 
    global $wp_roles; 

    $all_orders = get_posts(array(
    'numberposts' => -1, 
     //'meta_key' => '_customer_user', 
     //'meta_value' => get_current_user_id(), 
     'post_type' => 'shop_order', 
    'post_status' => 'completed', 
    )); 

    $args = get_posts(array(
    'numberposts' => -1, 
    'meta_key' => '_customer_user', 
    'meta_value' => get_current_user_id(), 
    'post_type' => 'shop_order', 
    'post_status' => 'completed', 
    )); 

if(! empty($args)){ 
foreach($args as $item) { 
    setup_postdata($item); 

$order = new WC_Order($item->ID); 

$order->populate($item);   
$items = $order->get_items(); 

foreach ($items as $key => $item2) : 
    $event_id_in_product = absint($item2['product_id']); 
    endforeach; 

     //trouve la catégorie du produit acheté par le stagiaire 
    //Get all terms associated with post in woocommerce's taxonomy 'product_cat' 
    $terms = get_the_terms($event_id_in_product, 'product_cat'); 

    //Get an array of their IDs 
    $term_ids = wp_list_pluck($terms,'term_id'); 

    //Get array of parents - 0 is not a parent 
    $parents = array_filter(wp_list_pluck($terms,'parent')); 

    //Get array of IDs of terms which are not parents. 
    $term_ids_not_parents = array_diff($term_ids, $parents); 

    //Get corresponding term objects. 
    $terms_not_parents = array_intersect_key($terms, $term_ids_not_parents); 

    //Extract the name of the category from the array and post it. 
    foreach($terms_not_parents as $term_not_parent){ 
     $beta = $term_not_parent->name; 

    $alpha = strip_tags($beta); 
    $alpha = trim(strip_tags($alpha)); 
    $alpha = str_replace(' - ',' ',$alpha); 
    $alpha = str_replace('Stage','stagiaire',$alpha); 
    $alpha = strtolower($alpha); 


$all_roles = $wp_roles->roles; 
    $user = new WP_User($current_user->ID); 
    $result = $user->add_role($alpha, $alpha, array($alpha =>true,)); // Array was missing in previous version ! 

return $order_id; 
} 
} 
} 
+0

これは私があなたに頼んでいるものを正確に追っていくことは容易ではありません。あなたに正直なところです。これは私が理解しているものです。 –

+0

顧客が注文を完了した後、それらのアカウントを作成し、購入した商品のカテゴリーに基づいてその役割を持たせたいと考えています。その役割は、同じ名前のチュートリアルカテゴリに直接関係しています。 – imvain2

+0

チュートリアルを自分のコースを購入する人に限定したいが、購入する製品のカテゴリに対応するチュートリアルにアクセスする必要があるとします。例:コースを「基本的」に購入するので、基本的な "チュートリアルではなく、"高度な "チュートリアルです。 (ユーザー役割と機能に基づいてアクセスを管理するためのプラグインを使用)顧客は "顧客役割"として登録されており、 "基本的なチュートリアル"にアクセスすることはできません。 –

答えて

0
(ここでは、それは2.3午前です...私は機能のページに直接ではないテスト...明日それを行います)私はいくつかの重要なステップを忘れてしまったと私は最終的に私のテストコードで働いていなかったものを発見します

これはソリューションであり、それは

// Retrieve customer order 
$blc_args = get_posts(array('numberposts' => -1,'meta_key' =>'_customer_user','meta_value' => get_current_user_id(),'post_type' => 'shop_order','post_status' => 'completed',)); 

if(! empty($blc_args)){ 
foreach($blc_args as $blc_item) { 
    setup_postdata($item); 

    $blc_order = new WC_Order($blc_item->ID); 

    $blc_order->populate($blc_item); 

    $blc_items = $blc_order->get_items(); 

    foreach ($blc_items as $blc_key => $blc_item2) : 
    //print_r($item2); 
    $event_id_in_product = absint($blc_item2['product_id']); 

    //Get all terms associated with post in woocommerce's taxonomy 'product_cat' 
    $blc_terms = get_the_terms($event_id_in_product, 'product_cat'); 

    //echo"</br>"; 
    //echo "Event ID embed in product bought : " . $event_id_in_product; 
    //echo"</br>"; 

    //Get an array of their IDs 
    $blc_term_ids = wp_list_pluck($blc_terms,'term_id'); 

    //Get array of parents - 0 is not a parent 
    $blc_parents = array_filter(wp_list_pluck($blc_terms,'parent')); 

    //Get array of IDs of terms which are not parents. 
    $blc_term_ids_not_parents = array_diff($blc_term_ids, $blc_parents); 

    //Get corresponding term objects. 
    $blc_terms_not_parents = array_intersect_key($blc_terms, $blc_term_ids_not_parents); 

    //Extract the name of the category from the array and post it. 
    foreach($blc_terms_not_parents as $blc_term_not_parent){ 
     $blc_start = $blc_term_not_parent->name; 
    } 

    if(preg_match("/(Ultérieure|cadeau)/i", $blc_start)){ 

    }else{ 
     $beta = utf8_decode($blc_start); 
     $beta = trim(strip_tags($beta)); 
     $beta_without_accent = strtr($beta, utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'), 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY'); 
     $beta_with_minuscule = strtolower($beta_without_accent); 
     $beta_with_minuscule = str_replace('balade - ','stagiaire_',$beta_with_minuscule); 
     $beta_with_underscore = str_replace(' - ', '_', $beta_with_minuscule); 
     $beta_stagiaire = str_replace('stage','stagiaire',$beta_with_underscore); 

     global $current_user; 

     $user = new WP_User($current_user->ID); 
     $user->add_role($beta_stagiaire); 
    } 
    endforeach; 
} 
} 
...はい...しかし...私のテストページの下に大きな働いしかしです!私の子供のテーマの下で私の機能で編集し、解析するとき、それはそれをしません。最終的なエコーが(時には)表示され、私に正しい「作成する役割」を返すので、時にはそれを処理するように見えることがあります。

ここでは、同じコードですが、function.phpに含めることを建てる:

add_action('woocommerce_payment_complete', 'custom_process_order', 10, 1); 

function custom_process_order($order_id) { 
    global $current_user; 

    $order = wc_get_order($order_id); 
    $items = $order->get_items(); 

//  echo"</br>"; 
//  echo "Product ID : " . ($order->id); 

    //$order->populate($item); 
    //print_r($order); 

    $items = $order->get_items(); 

    foreach ($items as $key => $item2) : 
    //print_r($item2); 
    $event_id_in_product = absint($item2['product_id']); 

    //Get all terms associated with post in woocommerce's taxonomy 'product_cat' 
    $terms = get_the_terms($event_id_in_product, 'product_cat'); 

    //echo"</br>"; 
    //echo "Event ID embed in product bought : " . $event_id_in_product; 
    //echo"</br>"; 

    //Get an array of their IDs 
    $term_ids = wp_list_pluck($terms,'term_id'); 

    //Get array of parents - 0 is not a parent 
    $parents = array_filter(wp_list_pluck($terms,'parent')); 

    //Get array of IDs of terms which are not parents. 
    $term_ids_not_parents = array_diff($term_ids, $parents); 

    //Get corresponding term objects. 
    $terms_not_parents = array_intersect_key($terms, $term_ids_not_parents); 

    //Extract the name of the category from the array and post it. 
    foreach($terms_not_parents as $term_not_parent){ 
     $start = $term_not_parent->name;    
    } 

    //echo"</br>"; 
    //echo "Product Category : " . $start; 
    //echo"</br>"; 

    if(preg_match("/(Ultérieure|cadeau)/i", $start)){ 
//echo"</br>"; 
    //echo "Don't add that Product Category : " . $start; 
    //echo"</br>"; 
    }else{ 
    $beta = utf8_decode($start); 
    $beta = trim(strip_tags($beta)); 
    $beta_without_accent = strtr($beta, utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'), 'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY'); 
    $beta_with_minuscule = strtolower($beta_without_accent); 
    $beta_with_minuscule = str_replace('balade - ','stagiaire_',$beta_with_minuscule); 
    $beta_with_underscore = str_replace(' - ', '_', $beta_with_minuscule); 
    $beta_stagiaire = str_replace('stage','stagiaire',$beta_with_underscore); 

    echo"</br>"; 
    echo "Role to create : " . $beta_stagiaire; 
    echo"</br>"; 

    $user = new WP_User($current_user->ID); 

    $user->add_role($beta_stagiaire); 
    } 
    endforeach; 


return $order_id; 
} 

そして、あなたは私が支払いプロセスをしなければならないので、それは簡単ではありません、それをテストするために想像することができます。

どこかに間違えていますか?私はそれを見ない。

+0

解決策:私の子供のテーマの関数では機能しませんので、私の子供のテーマのカスタム "thankyou.php"に入れて、今は100%働いています。あなたのアプリケーションのためにそれを使用する場合は、私は役割とカテゴリ名を処理する方法をカスタムします。コードはクリーンなコードではなく、誰かがそれをきれいにして機能として動作させる方法を見つけたら...私に教えてください。 –

+0

あなたのPHPをUTF8 NO BOMとして保存することを忘れないでください;-) –

関連する問題