WordPress.org

Plugin Directory

Changeset 1794644


Ignore:
Timestamp:
12/30/17 19:15:55 (3 weeks ago)
Author:
shopybot
Message:

Fixed generating product param and multiple images

Location:
shopybot-woocommerce/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • shopybot-woocommerce/trunk/assets/css/style.css

    r1720404 r1794644  
    2626} 
    2727 
    28 #woocommerce_shopybot-woocommerce_connect{ 
     28#woocommerce_shopybot-woocommerce_connect { 
    2929    background-color: royalblue; 
    3030    color: #FFFFFF; 
     
    4949} 
    5050 
    51  
    5251#woocommerce_shopybot-woocommerce_disconnect_facebook_page, 
    5352#woocommerce_shopybot-woocommerce_connect_facebook_page { 
     
    6564    font-size: 20px; 
    6665} 
     66 
    6767.shopybot-fb-page-name > span { 
    6868    float: left; 
  • shopybot-woocommerce/trunk/includes/class-wc-shopybot-export.php

    r1720404 r1794644  
    11<?php 
    22 
    3 class WC_Shopybot_Export 
    4 { 
     3class WC_Shopybot_Export { 
     4    private $id;              // plugin ID 
     5     
     6    private $currentpage;     // current export page 
     7    private $vendors;         // brand 
     8    private $salesNote;       // sale notes 
     9    private $yaml_finished;   // is export finished 
     10    private $debug;           // debug on/off 
     11    private $isgroupidattr;   // adding group_id to var. products 
     12     
     13    function __construct( $export_id, $settings ) { 
     14        $this->id          = $export_id; 
     15        $this->shellPrefix = $export_id; 
     16         
     17        $this->currentpage   = ( get_option( $this->id . '_page' ) ) ? get_option( $this->id . '_page' ) : 1; 
     18        $this->pages         = ( get_option( $this->id . '_pages' ) ) ? get_option( $this->id . '_pages' ) : 1; 
     19        $this->yaml_finished = false; 
     20        $this->debug         = false; 
     21        $this->posts         = get_option( $this->id . '_get_ids' ); 
     22        $this->md5offer      = array(); 
     23         
     24        $def_settings = array( 
     25            'isdeliver'       => false, 
     26            'isexportattr'    => false, 
     27            'isexporpictures' => false, 
     28            'ispickup'        => 'false', 
     29            'isstore'         => 'false', 
     30            'cpa'             => false, 
     31            'isgroupidattr'   => false, 
     32            'bid'             => false, 
     33            'isbid'           => false, 
     34            'vendors'         => false, 
     35            'salesNote'       => '' 
     36        ); 
     37         
     38        foreach ( $def_settings as $set => $val ) { 
     39             
     40            if ( isset( $settings[ $set ] ) ) { 
     41                $this->{$set} = $settings[ $set ]; 
     42            } else { 
     43                $this->{$set} = $val; 
     44            } 
     45             
     46        } 
     47         
     48        add_action( 'init', array( $this, 'init' ) ); 
     49         
     50         
     51        if ( isset( $_GET['tab'] ) && $_GET['tab'] == $this->id and isset( $_REQUEST['save'] ) ) { 
     52            $this->action_unlock(); 
     53        } 
     54    } 
     55     
     56    /** 
     57     * Init 
     58     */ 
     59    public function init() { 
     60        add_filter( 'mod_rewrite_rules', array( $this, 'add_htaccess_rule' ) ); 
     61         
     62        add_action( "added_post_meta", array( $this, 'generateOffer' ), 10, 2 ); 
     63        add_action( 'updated_postmeta', array( $this, 'generateOffer' ), 10, 2 ); 
     64        add_action( 'wp_insert_post', array( $this, 'wp_insert_post' ), 1, 2 ); 
     65        add_action( 'set_object_terms', array( $this, 'set_object_terms' ), 1 ); 
     66         
     67        add_action( 'wp_ajax_shopybot_woocommerce_ajaxUpdateOffers', array( $this, 'ajaxUpdateOffers' ) ); 
     68         
     69        $this->shell(); 
     70        $this->getYmlAction(); 
     71    } 
     72     
     73    public function add_htaccess_rule( $rules ) { 
     74        $rules .= "RewriteRule ^" . $this->id . ".xml index.php\n"; 
     75        $rules .= "RewriteRule ^" . $this->id . ".xml.gz index.php\n"; 
     76         
     77        return $rules; 
     78    } 
     79     
     80    public function getYmlAction() { 
     81        if ( get_option( 'permalink_structure' ) != '' ) { 
     82            $url = parse_url( $this->siteURL() . $_SERVER['REQUEST_URI'] ); 
     83             
     84            if ( $url['path'] == '/' . $this->id . '.xml' ) { 
     85                $this->getYml(); 
     86                die; 
     87            } 
     88             
     89            if ( $url['path'] == '/' . $this->id . '.xml.gz' ) { 
     90                $this->getYml( true ); 
     91                die; 
     92            } 
     93        } else { 
     94            if ( isset( $_GET[ $this->id . '_export' ] ) ) { 
     95                 
     96                $gzip = ( isset( $_GET['gzip'] ) ) ? true : false; 
     97                $this->getYml( $gzip ); 
     98                die; 
     99            } 
     100        } 
     101    } 
     102     
     103    private function siteURL() { 
     104        $protocol   = ( ! empty( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443 ) ? "https://" : "http://"; 
     105        $domainName = $_SERVER['HTTP_HOST']; 
     106         
     107        return $protocol . $domainName; 
     108    } 
     109     
     110     
     111    public function bread( $text ) { 
     112        if ( is_string( $text ) ) { 
     113            $result = $text . "\n"; 
     114        } elseif ( is_array( $text ) or is_object( $text ) ) { 
     115            $result = print_r( $text, true ) . "\n"; 
     116        } 
     117         
     118        $this->bread[] = $result; 
     119         
     120        if ( $this->debug ) { 
     121            echo $result; 
     122        } 
     123    } 
     124     
     125    /* 
     126    Метод позволяет узнать запущен ли процесс выгрузки 
     127    */ 
     128    final public function inProcess() { 
     129         
     130        $inProcess = get_option( $this->id . '_in_process' ); 
     131         
     132        if ( empty( $inProcess ) ) { 
     133            update_option( $this->id . '_in_process', 'no' ); 
     134             
     135            return false; 
     136        } 
     137         
     138        if ( $inProcess == 'no' ) { 
     139            return false; 
     140        } else { 
     141            return true; 
     142        } 
     143         
     144    } 
     145     
     146    /** 
     147     * Sets the export status: yes/no 
     148     */ 
     149    final public function inProcessSet( $set ) { 
     150        if ( in_array( $set, array( 'yes', 'no' ) ) ) { 
     151            update_option( $this->id . '_in_process', $set ); 
     152        } 
     153    } 
     154     
     155     
     156    /** 
     157     * set current page of the export 
     158     */ 
     159    final public function setPage( $page ) { 
     160        $this->currentpage = $page; 
     161        update_option( $this->id . '_page', $page ); 
     162    } 
     163     
     164     
     165    /* 
     166    Включает вывод отладочной информации 
     167    */ 
     168    public function debugOn() { 
     169        $this->debug = true; 
     170    } 
     171     
     172     
     173    /** 
     174     * Debug off 
     175     */ 
     176    public function debugOff() { 
     177        $this->debug = false; 
     178    } 
     179     
     180    /** 
     181     * Blocks the export (multiple button click error) 
     182     */ 
     183    final public function exportLock() { 
     184        update_option( $this->id . '_lock', true ); 
     185    } 
     186     
     187    /** 
     188     * Unblocks the export 
     189     */ 
     190    final public function exportUnlock() { 
     191        update_option( $this->id . '_lock', false ); 
     192    } 
     193     
     194    /** 
     195     * Checks whether export is blocked 
     196     */ 
     197    final public function isLock() { 
     198        return get_option( $this->id . '_lock' ); 
     199    } 
     200     
     201    final public function numberOffers() { 
     202        global $wpdb; 
     203        $ids = $this->getIdsForExport(); 
     204        $ids = implode( ',', $ids->posts ); 
     205         
     206        $offers = $wpdb->get_results( "SELECT COUNT(*) as num_offers FROM {$wpdb->prefix}postmeta WHERE meta_key='" . $this->id . "_yml_offer' AND post_id IN ($ids)" ); 
     207         
     208        return $offers[0]->num_offers; 
     209    } 
     210     
     211    /** 
     212     * Export categories 
     213     */ 
     214    final public function renderCats() { 
     215        $get_terms = $this->getRelationsTax(); 
     216         
     217        if ( ! empty( $get_terms['product_cat'] ) ) { 
     218            if ( in_array( 'all', $get_terms['product_cat'] ) ) { 
     219                $terms = get_terms( 'product_cat' ); 
     220            } else { 
     221                $terms = get_terms( 'product_cat', array( 'include' => $get_terms['product_cat'] ) ); 
     222            } 
     223        } else { 
     224            $terms = get_terms( 'product_cat' ); 
     225        } 
     226         
     227        if ( ! empty( $terms ) ) { 
     228             
     229            $yml = '<categories>' . "\n"; 
     230             
     231            foreach ( $terms as $key => $cat ) { 
     232                 
     233                $parent = ( $cat->parent ) ? 'parentId="' . $cat->parent . '"' : ''; 
     234                 
     235                $yml .= "\t\t" . '<category id="' . $cat->term_id . '" ' . $parent . '>' . $cat->name . '</category>' . "\n"; 
     236            } 
     237             
     238            $yml .= '</categories>' . "\n"; 
     239             
     240            $yml = apply_filters( $this->id . '_render_cats', $yml ); 
     241             
     242            return $yml; 
     243             
     244        } 
     245    } 
     246     
     247    /** 
     248     * Export currencies 
     249     */ 
     250    final public function renderCurrency() { 
     251        $yml = '<currency id="' . $this->getWooCurrency() . '" rate="1"/>'; 
     252         
     253        $yml = apply_filters( $this->id . '_render_currency', $yml ); 
     254         
     255        return $yml; 
     256    } 
     257     
     258     
     259    /** 
     260     * Gets product attrs 
     261     */ 
     262    final public function getProductAttributes( $product ) { 
     263        $attributes = $product->get_attributes(); 
     264        $out_attr   = ''; 
     265         
     266        foreach ( $attributes as $key => $attribute ) { 
     267             
     268            if ( $attribute['is_taxonomy'] && ! taxonomy_exists( $attribute['name'] ) ) { 
     269                continue; 
     270            } 
     271             
     272            $name = wc_attribute_label( $attribute['name'] ); 
     273             
     274            if ( $attribute['is_taxonomy'] ) { 
     275                 
     276                if ( $product->product_type == 'variation' && array_key_exists( 'attribute_' . $attribute['name'], $product->variation_data ) ) { 
     277                     
     278                    $value = apply_filters( 'woocommerce_attribute', $product->variation_data[ 'attribute_' . $attribute['name'] ] ); 
     279                     
     280                } 
     281                 
     282                if ( $product->product_type != 'variation' || empty( $value ) ) { 
     283                    $values = wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) ); 
     284                    $value  = apply_filters( 'woocommerce_attribute', wptexturize( implode( ', ', $values ) ), $attribute, $values ); 
     285                } 
     286                 
     287            } else { 
     288                 
     289                if ( $product->product_type == 'variation' && array_key_exists( 'attribute_' . $attribute['name'], $product->variation_data ) ) { 
     290                     
     291                    $value = apply_filters( 'woocommerce_attribute', $product->variation_data[ 'attribute_' . $attribute['name'] ] ); 
     292                     
     293                } else { 
     294                    // Convert pipes to commas and display values 
     295                    $values = array_map( 'trim', explode( WC_DELIMITER, $attribute['value'] ) ); 
     296                    $value  = apply_filters( 'woocommerce_attribute', wptexturize( implode( ', ', $values ) ), $attribute, $values ); 
     297                } 
     298            } 
     299             
     300            if ( ! empty( $value ) and ! empty( $name ) ) { 
     301                $out_attr .= '<param name="' . $name . '">' . $value . '</param>' . "\n"; 
     302            } 
     303             
     304        } 
     305         
     306        $out_attr = apply_filters( $this->id . '_export_attributes', $out_attr, $product, $attributes ); 
     307         
     308        return $out_attr; 
     309         
     310    } 
     311     
     312    /** 
     313     * Product images 
     314     */ 
     315    final public function getImagesProduct( $product ) { 
     316        $images = array(); 
     317         
     318        if ( $product->product_type == 'variation' && method_exists( $product, 'get_image_id' ) ) { 
     319            $image_id = $product->get_image_id(); 
     320        } else { 
     321            $image_id = get_post_thumbnail_id( $product->id ); 
     322        } 
     323         
     324        $general_image = WC_Shopybot_Functions::sanitize( wp_get_attachment_url( $image_id ) ); 
     325         
     326        if ( ! empty( $general_image ) ) { 
     327            $images[] = $general_image; 
     328        } 
     329         
     330        $ids = $product->get_gallery_attachment_ids(); 
     331         
     332        if ( ! empty( $ids ) ) { 
     333             
     334            foreach ( $ids as $id ) { 
     335                $image = wp_get_attachment_image_src( $id, 'full' ); 
     336                if ( ! empty( $image[0] ) ) { 
     337                    $images[] = WC_Shopybot_Functions::sanitize( $image[0] ); 
     338                } 
     339                 
     340            } 
     341        } 
     342         
     343        return $images; 
     344    } 
     345     
     346    /** 
     347     * Sets export params 
     348     */ 
     349    final public function setOfferParams( $product ) { 
     350         
     351        $terms = wp_get_post_terms( $product->id, 'product_cat' ); 
     352         
     353        if ( ! empty( $terms ) ) { 
     354            $cat = $terms[0]->term_id; 
     355        } else { 
     356            $this->bread( 'cat not set id=' . $product->id ); 
     357             
     358            return false; 
     359        } 
     360         
     361        $excerpt     = trim( $product->post->post_excerpt ); 
     362        $description = ( ! empty( $excerpt ) ) ? $excerpt : $product->post->post_content; 
     363        $description = WC_Shopybot_Functions::substr( $description, 500, false ); 
     364         
     365        if ( $this->vendors == false ) { 
     366            $vendor = get_post_meta( $product->id, '_vendor', true ); 
     367        } else { 
     368             
     369            $terms = wp_get_post_terms( $product->id, $this->vendors ); 
     370             
     371            if ( ! is_wp_error( $terms ) ) { 
     372                if ( ! empty( $terms[0] ) ) { 
     373                    $vendor = $terms[0]->name; 
     374                } 
     375            } 
     376             
     377        } 
     378         
     379        if ( empty( $vendor ) ) { 
     380            $vendor = get_option( $this->id . '_def_vendor' ); 
     381        } 
     382         
     383        if ( empty( $vendor ) ) { 
     384            $vendor = 'none'; 
     385        } 
     386         
     387         
     388        $pictures = $this->getImagesProduct( $product ); 
     389         
     390        if ( empty( $pictures ) ) { 
     391            return false; 
     392        } 
     393         
     394         
     395        $params = array( 
     396            'url'         => WC_Shopybot_Functions::sanitize( urldecode( esc_attr( $product->get_permalink() ) ) ), 
     397            'price'       => $product->get_price(), 
     398            'currencyId'  => $this->getWooCurrency(), 
     399            'categoryId'  => $cat, 
     400            'picture'     => $pictures, 
     401            'store'       => ( $this->isdeliver and ! $this->cpa ) ? $this->isstore : '', 
     402            'pickup'      => ( $this->isdeliver and ! $this->cpa ) ? $this->ispickup : '', 
     403            'delivery'    => ( $this->isdeliver and ! $this->cpa ) ? 'true' : '', 
     404            'vendor'      => $vendor, 
     405            'name'        => WC_Shopybot_Functions::del_symvol( strip_tags( $product->post->post_title ) ), 
     406            'description' => WC_Shopybot_Functions::del_symvol( strip_tags( $description ) ), 
     407            'sales_notes' => ( ! empty( $this->salesNote ) ) ? WC_Shopybot_Functions::substr( $this->salesNote, 50, false ) : '', 
     408            'cpa'         => ( $this->cpa ) ? $this->cpa : '', 
     409        ); 
     410         
     411         
     412        $params = apply_filters( $this->id . '_set_offer_params', $params, $product ); 
     413         
     414        if ( empty( $params['vendor'] ) ) { 
     415            $this->bread( 'vendor not set id=' . $product->id ); 
     416             
     417            return false; 
     418        } 
     419         
     420        if ( empty( $params['name'] ) ) { 
     421            $this->bread( 'name not set id=' . $product->id ); 
     422             
     423            return false; 
     424        } 
     425         
     426         
     427        if ( $params['price'] == 0 ) { 
     428            return false; 
     429        } 
     430         
     431         
     432        $params['sales_notes'] = WC_Shopybot_Functions::substr( $params['sales_notes'], 50, false ); 
     433         
     434        return $params; 
     435    } 
     436     
     437     
     438    /** 
     439     * Exports page of the products 
     440     */ 
     441    final public function renderPartOffers() { 
     442        $products = $this->makeQuery(); 
     443         
     444        if ( $products->post_count == $products->found_posts ) { 
     445            $this->yaml_finished = true; 
     446        } 
     447         
     448        if ( $products->have_posts() ) { 
     449             
     450            $this->bread( 'found posts' ); 
     451             
     452            while ( $products->have_posts() ) { 
     453                 
     454                $products->the_post(); 
     455                $product = get_product( $products->post->ID ); 
     456                 
     457                if ( $product->product_type == 'simple' || $product->product_type == 'variation' ) { 
     458                     
     459                    //не нужно включать вариации, у которых нет отличий от основного товара и других вариаций 
     460                    if ( $product->product_type == 'variation' ) { 
     461                         
     462                        if ( ! $this->checkVariationUniqueness( $product ) ) { 
     463                             
     464                            delete_post_meta( $product->variation_id, $this->id . '_yml_offer' ); 
     465                            $this->bread( 'WARNING: skipping product variation ID ' . $product->variation_id . ' (product ID ' . $product->id . ') — variation has no unique attributes' ); 
     466                            continue; 
     467                             
     468                        } 
     469                         
     470                    } 
     471                     
     472                    $this->renderPartOffer( $product ); 
     473                     
     474                } 
     475                 
     476            } 
     477             
     478            wp_reset_postdata(); 
     479             
     480            $this->setPage( $this->currentpage + 1 ); 
     481             
     482        } else { 
     483            $this->bread( 'no have posts' ); 
     484            $this->yaml_finished = true; 
     485        } 
     486         
     487    } 
     488     
     489    final public function renderPartOffer( $product ) { 
     490        $param = $this->setOfferParams( $product ); 
     491         
     492        if ( $product->product_type == 'variation' ) { 
     493            $product_id = $product->variation_id; 
     494        } else { 
     495            $product_id = $product->id; 
     496        } 
     497         
     498         
     499        if ( ! empty( $param ) ) { 
     500            $offer = ''; 
     501             
     502            $available = ( $product->is_in_stock() == 'instock' ) ? "true" : "false"; 
     503            $available = apply_filters( $this->id . '_set_offer_param_available', $available, $product ); 
     504             
     505            if ( $this->isbid == true ) { 
     506                $bid = ( $this->bid ) ? 'bid="' . $this->bid . '"' : ''; 
     507            } else { 
     508                $bid = ""; 
     509            } 
     510             
     511            $offer .= '<offer id="' . $product_id . '" type="vendor.model" available="' . $available . '" ' . $bid; 
     512             
     513            if ( $product->product_type == 'variation' && $this->isgroupidattr && isset( $product->parent->id ) ) { 
     514                $offer .= ' group_id="' . $product->parent->id . '"'; 
     515            } 
     516             
     517             
     518            $offer .= '>' . "\n"; 
     519             
     520            foreach ( $param as $key => $value ) { 
     521                 
     522                if ( ! empty( $value ) ) { 
     523                     
     524                    if ( is_array( $value ) ) { 
     525                         
     526                        foreach ( $value as $values ) { 
     527                            $offer .= "<$key>" . $values . "</$key>\n"; 
     528                        } 
     529                         
     530                    } else { 
     531                        $offer .= "<$key>" . $value . "</$key>\n"; 
     532                    } 
     533                     
     534                } 
     535                 
     536            } 
     537             
     538            $offer .= $this->getProductAttributes( $product ); 
     539             
     540            $offer .= '</offer>' . "\n"; 
     541             
     542            if ( ! empty( $offer ) ) { 
     543                 
     544                $md5offer = md5( $offer ); 
     545                 
     546                if ( ! in_array( $md5offer, $this->md5offer ) ) { 
     547                     
     548                     
     549                    $this->md5offer[] = $md5offer; 
     550                     
     551                    update_post_meta( $product_id, $this->id . '_yml_offer', $offer ); 
     552                     
     553                    return true; 
     554                     
     555                } 
     556            } else { 
     557                update_post_meta( $product_id, $this->id . '_yml_offer', '' ); 
     558                 
     559                return false; 
     560            } 
     561             
     562        } else { 
     563            update_post_meta( $product_id, $this->id . '_yml_offer', '' ); 
     564             
     565            return false; 
     566        } 
     567    } 
     568     
     569    /** 
     570     * Check variation 
     571     */ 
     572    final public function checkVariationUniqueness( $variation ) { 
     573         
     574        $product = get_product( $variation->id ); 
     575         
     576        if ( ! is_object( $product ) || ! ( $product instanceof WC_Product_Variable ) ) { 
     577            return false; 
     578        } 
     579         
     580        if ( method_exists( $product, 'get_children' ) ) { 
     581            $children = $product->get_children(); 
     582        } else { 
     583            return false; 
     584        } 
     585         
     586        $differs      = false; 
     587        $pairs_differ = array(); 
     588         
     589        foreach ( $children as $_id ) { 
     590             
     591            $_variation = get_product( $_id ); 
     592             
     593            if ( $_variation->variation_id == $variation->variation_id ) { 
     594                continue; 
     595            } 
     596             
     597             
     598            $pair_differs = false; 
     599             
     600            foreach ( $variation->variation_data as $attr => $value ) { 
     601                 
     602                foreach ( $_variation->variation_data as $attr_compare => $value_compare ) { 
     603                     
     604                    if ( $attr === $attr_compare && $value !== $value_compare ) { 
     605                        $pair_differs = true; 
     606                        break; 
     607                    } 
     608                     
     609                } 
     610                 
     611                if ( $pair_differs ) { 
     612                    break; 
     613                } 
     614                 
     615            } 
     616             
     617            $pairs_differ[] = $pair_differs; 
     618             
     619        } 
     620         
     621        $differs = in_array( false, $pairs_differ ) ? false : true; 
     622         
     623        return $differs; 
     624         
     625    } 
     626     
     627    final public function getShellArg() { 
     628        $shell_arg = @getopt( "", array( "wooexportyml_" . $this->shellPrefix . "::", "debug::", "unlock::", 'fullexport::', "unittests::" ) ); 
     629         
     630        if ( empty( $shell_arg ) ) { 
     631            $shell_arg = array(); 
     632        } else { 
     633            $shell_arg = array_keys( $shell_arg ); 
     634        } 
     635         
     636        return $shell_arg; 
     637    } 
     638     
     639    /** 
     640     * shell params 
     641     * attrs: 
     642     * --wooexportyml - required, main key 
     643     * --debug        - optional, show debug info 
     644     * --unlock       - optoinal, unlocks the export 
     645     * --fullexport   - optional, full export, not paginated 
     646     */ 
     647    public function shell() { 
     648        global $wpdb; 
     649         
     650        $shell_arg = $this->getShellArg(); 
     651         
     652        if ( in_array( 'wooexportyml_' . $this->shellPrefix, $shell_arg ) ) { 
     653            if ( in_array( 'unlock', $shell_arg ) ) { 
     654                $this->action_unlock(); 
     655                die; 
     656            } 
     657             
     658            if ( in_array( 'debug', $shell_arg ) ) { 
     659                $this->debugOn(); 
     660            } 
     661             
     662            $this->action_fullexport(); 
     663            die; 
     664        } 
     665    } 
     666     
     667    /** 
     668     * Unlocks the export 
     669     */ 
     670    public function action_unlock() { 
     671        $this->inProcessSet( 'no' ); 
     672        $this->setPage( 1 ); 
     673        $this->exportUnlock(); 
     674    } 
     675     
     676    /** 
     677     * Full re-export, not paginated 
     678     */ 
     679    public function action_fullexport() { 
     680        $this->inProcessSet( 'no' ); 
     681        $this->setPage( 1 ); 
     682        $this->exportUnlock(); 
     683         
     684        while ( ! $this->yaml_finished ) { 
     685            $this->export(); 
     686        } 
     687    } 
     688     
     689    /** 
     690     * Main export function 
     691     */ 
     692    public function export() { 
     693        if ( ! $this->isLock() ) { 
     694             
     695            $this->exportLock(); 
     696             
     697            if ( $this->inProcess() ) { 
     698                 
     699                $this->bread( 'in process' ); 
     700                 
     701                $this->renderPartOffers(); 
     702                 
     703            } else { 
     704                 
     705                $this->bread( 'not in process' ); 
     706                 
     707                 
     708                $this->bread( 'check time true' ); 
     709                 
     710                $this->inProcessSet( 'yes' ); 
     711                $this->renderPartOffers(); 
     712                 
     713            } 
     714             
     715            if ( $this->yaml_finished ) { 
     716                 
     717                $this->bread( 'is yaml_finished true' ); 
     718                 
     719                $this->inProcessSet( 'no' ); 
     720                $this->setPage( 1 ); 
     721            } 
     722             
     723            $this->exportUnlock(); 
     724        } else { 
     725            $this->bread( 'process is lock' ); 
     726        } 
     727    } 
     728     
     729     
     730    /** 
     731     * Renders YAML head 
     732     */ 
     733    final public function renderHead( $arg ) { 
     734        extract( $arg ); 
     735        echo '<?xml version="1.0" encoding="utf-8"?> 
    5736 
    6  
    7     private $id;              // plugin ID 
    8  
    9     private $currentpage;     // current export page 
    10     private $vendors;         // brand 
    11     private $salesNote;       // sale notes 
    12     private $yaml_finished;   // is export finished 
    13     private $debug;           // debug on/off 
    14     private $isgroupidattr;   // adding group_id to var. products 
    15  
    16     function __construct($export_id, $settings) 
    17     { 
    18         $this->id = $export_id; 
    19         $this->shellPrefix = $export_id; 
    20  
    21         $this->currentpage = (get_option($this->id . '_page')) ? get_option($this->id . '_page') : 1; 
    22         $this->pages = (get_option($this->id . '_pages')) ? get_option($this->id . '_pages') : 1; 
    23         $this->yaml_finished = false; 
    24         $this->debug = false; 
    25         $this->posts = get_option($this->id . '_get_ids'); 
    26         $this->md5offer = array(); 
    27  
    28         $def_settings = array( 
    29             'isdeliver' => false, 
    30             'isexportattr' => false, 
    31             'isexporpictures' => false, 
    32             'ispickup' => 'false', 
    33             'isstore' => 'false', 
    34             'cpa' => false, 
    35             'isgroupidattr' => false, 
    36             'bid' => false, 
    37             'isbid' => false, 
    38             'vendors' => false, 
    39             'salesNote' => '' 
    40         ); 
    41  
    42         foreach ($def_settings as $set => $val) { 
    43  
    44             if (isset($settings[$set])) 
    45                 $this->{$set} = $settings[$set]; 
    46             else 
    47                 $this->{$set} = $val; 
    48  
    49         } 
    50  
    51         add_action('init', array($this, 'init')); 
    52  
    53  
    54         if (isset($_GET['tab']) && $_GET['tab'] == $this->id and isset($_REQUEST['save'])) { 
    55             $this->action_unlock(); 
    56         } 
    57  
    58  
    59     } 
    60  
    61     /** 
    62      * Init 
    63      */ 
    64     public function init() 
    65     { 
    66         add_filter('mod_rewrite_rules', array($this, 'add_htaccess_rule')); 
    67  
    68         add_action("added_post_meta", array($this, 'generateOffer'), 10, 2); 
    69         add_action('updated_postmeta', array($this, 'generateOffer'), 10, 2); 
    70         add_action('wp_insert_post', array($this, 'wp_insert_post'), 1, 2); 
    71         add_action('set_object_terms', array($this, 'set_object_terms'), 1); 
    72  
    73         add_action('wp_ajax_shopybot_woocommerce_ajaxUpdateOffers', array($this, 'ajaxUpdateOffers')); 
    74  
    75         $this->shell(); 
    76         $this->getYmlAction(); 
    77     } 
    78  
    79  
    80     public function add_htaccess_rule($rules) 
    81     { 
    82         $rules .= "RewriteRule ^" . $this->id . ".xml index.php\n"; 
    83         $rules .= "RewriteRule ^" . $this->id . ".xml.gz index.php\n"; 
    84  
    85         return $rules; 
    86     } 
    87  
    88  
    89     public function getYmlAction() 
    90     { 
    91         if (get_option('permalink_structure') != '') { 
    92             $url = parse_url($this->siteURL() . $_SERVER['REQUEST_URI']); 
    93  
    94             if ($url['path'] == '/' . $this->id . '.xml') { 
    95                 $this->getYml(); 
    96                 die; 
    97             } 
    98  
    99             if ($url['path'] == '/' . $this->id . '.xml.gz') { 
    100                 $this->getYml(true); 
    101                 die; 
    102             } 
    103         } else { 
    104             if (isset($_GET[$this->id . '_export'])) { 
    105  
    106                 $gzip = (isset($_GET['gzip'])) ? true : false; 
    107                 $this->getYml($gzip); 
    108                 die; 
    109             } 
    110         } 
    111     } 
    112  
    113  
    114     private function siteURL() 
    115     { 
    116         $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; 
    117         $domainName = $_SERVER['HTTP_HOST']; 
    118         return $protocol . $domainName; 
    119     } 
    120  
    121  
    122     public function bread($text) 
    123     { 
    124         if (is_string($text)) 
    125             $result = $text . "\n"; 
    126  
    127         elseif (is_array($text) or is_object($text)) 
    128             $result = print_r($text, true) . "\n"; 
    129  
    130         $this->bread[] = $result; 
    131  
    132         if ($this->debug) 
    133             echo $result; 
    134     } 
    135  
    136     /* 
    137         Метод позволяет узнать запущен ли процесс выгрузки 
    138     */ 
    139     final public function inProcess() 
    140     { 
    141  
    142         $inProcess = get_option($this->id . '_in_process'); 
    143  
    144         if (empty($inProcess)) { 
    145             update_option($this->id . '_in_process', 'no'); 
    146             return false; 
    147         } 
    148  
    149         if ($inProcess == 'no') 
    150             return false; 
    151         else 
    152             return true; 
    153  
    154     } 
    155  
    156     /** 
    157      * Sets the export status: yes/no 
    158      */ 
    159     final public function inProcessSet($set) 
    160     { 
    161         if (in_array($set, array('yes', 'no'))) { 
    162             update_option($this->id . '_in_process', $set); 
    163         } 
    164     } 
    165  
    166  
    167     /** 
    168      * set current page of the export 
    169      */ 
    170     final public function setPage($page) 
    171     { 
    172         $this->currentpage = $page; 
    173         update_option($this->id . '_page', $page); 
    174     } 
    175  
    176  
    177     /* 
    178         Включает вывод отладочной информации 
    179     */ 
    180     public function debugOn() 
    181     { 
    182         $this->debug = true; 
    183     } 
    184  
    185  
    186     /** 
    187      * Debug off 
    188      */ 
    189     public function debugOff() 
    190     { 
    191         $this->debug = false; 
    192     } 
    193  
    194     /** 
    195      * Blocks the export (multiple button click error) 
    196      */ 
    197     final public function exportLock() 
    198     { 
    199         update_option($this->id . '_lock', true); 
    200     } 
    201  
    202     /** 
    203      * Unblocks the export 
    204      */ 
    205     final public function exportUnlock() 
    206     { 
    207         update_option($this->id . '_lock', false); 
    208     } 
    209  
    210     /** 
    211      * Checks whether export is blocked 
    212      */ 
    213     final public function isLock() 
    214     { 
    215         return get_option($this->id . '_lock'); 
    216     } 
    217  
    218     final public function numberOffers() 
    219     { 
    220         global $wpdb; 
    221         $ids = $this->getIdsForExport(); 
    222         $ids = implode(',', $ids->posts); 
    223  
    224         $offers = $wpdb->get_results("SELECT COUNT(*) as num_offers FROM {$wpdb->prefix}postmeta WHERE meta_key='" . $this->id . "_yml_offer' AND post_id IN ($ids)"); 
    225  
    226         return $offers[0]->num_offers; 
    227     } 
    228  
    229     /** 
    230      * Export categories 
    231      */ 
    232     final public function renderCats() 
    233     { 
    234         $get_terms = $this->getRelationsTax(); 
    235  
    236         if (!empty($get_terms['product_cat'])) 
    237             if (in_array('all', $get_terms['product_cat'])) 
    238                 $terms = get_terms('product_cat'); 
    239             else 
    240                 $terms = get_terms('product_cat', array('include' => $get_terms['product_cat'])); 
    241         else 
    242             $terms = get_terms('product_cat'); 
    243  
    244         if (!empty($terms)) { 
    245  
    246             $yml = '<categories>' . "\n"; 
    247  
    248             foreach ($terms as $key => $cat) { 
    249  
    250                 $parent = ($cat->parent) ? 'parentId="' . $cat->parent . '"' : ''; 
    251  
    252                 $yml .= "\t\t" . '<category id="' . $cat->term_id . '" ' . $parent . '>' . $cat->name . '</category>' . "\n"; 
    253             } 
    254  
    255             $yml .= '</categories>' . "\n"; 
    256  
    257             $yml = apply_filters($this->id . '_render_cats', $yml); 
    258  
    259             return $yml; 
    260  
    261         } 
    262     } 
    263  
    264     /** 
    265      * Export currencies 
    266      */ 
    267     final public function renderCurrency() 
    268     { 
    269         $yml = '<currency id="' . $this->getWooCurrency() . '" rate="1"/>'; 
    270  
    271         $yml = apply_filters($this->id . '_render_currency', $yml); 
    272  
    273         return $yml; 
    274     } 
    275  
    276  
    277     /** 
    278      * Gets product attrs 
    279      */ 
    280     final public function getProductAttributes($product) 
    281     { 
    282         $attributes = $product->get_attributes(); 
    283         $out_attr = ''; 
    284  
    285         foreach ($attributes as $key => $attribute) { 
    286  
    287             if ($attribute['is_taxonomy'] && !taxonomy_exists($attribute['name'])) 
    288                 continue; 
    289  
    290             $name = wc_attribute_label($attribute['name']); 
    291  
    292             if ($attribute['is_taxonomy']) { 
    293  
    294                 if ($product->product_type == 'variation' && array_key_exists('attribute_' . $attribute['name'], $product->variation_data)) { 
    295  
    296                     $value = apply_filters('woocommerce_attribute', $product->variation_data['attribute_' . $attribute['name']]); 
    297  
    298                 } 
    299  
    300                 if ($product->product_type != 'variation' || empty($value)) { 
    301                     $values = wc_get_product_terms($product->id, $attribute['name'], array('fields' => 'names')); 
    302                     $value = apply_filters('woocommerce_attribute', wptexturize(implode(', ', $values)), $attribute, $values); 
    303                 } 
    304  
    305             } else { 
    306  
    307                 if ($product->product_type == 'variation' && array_key_exists('attribute_' . $attribute['name'], $product->variation_data)) { 
    308  
    309                     $value = apply_filters('woocommerce_attribute', $product->variation_data['attribute_' . $attribute['name']]); 
    310  
    311                 } else { 
    312                     // Convert pipes to commas and display values 
    313                     $values = array_map('trim', explode(WC_DELIMITER, $attribute['value'])); 
    314                     $value = apply_filters('woocommerce_attribute', wptexturize(implode(', ', $values)), $attribute, $values); 
    315                 } 
    316             } 
    317  
    318             if (!empty($value) and !empty($name)) { 
    319                 $out_attr .= '<param name="' . $name . '">' . $value . '</param>' . "\n"; 
    320             } 
    321  
    322         } 
    323  
    324         $out_attr = apply_filters($this->id . '_export_attributes', $out_attr, $product, $attributes); 
    325  
    326         return $out_attr; 
    327  
    328     } 
    329  
    330     /** 
    331      * Product images 
    332      */ 
    333     final public function getImagesProduct($product) 
    334     { 
    335         $images = array(); 
    336  
    337         if ($product->product_type == 'variation' && method_exists($product, 'get_image_id')) { 
    338             $image_id = $product->get_image_id(); 
    339         } else { 
    340             $image_id = get_post_thumbnail_id($product->id); 
    341         } 
    342  
    343         $general_image = WC_Shopybot_Functions::sanitize(wp_get_attachment_url($image_id)); 
    344  
    345  
    346         if (!empty($general_image)) 
    347             $images[] = $general_image; 
    348  
    349         if ($this->isexporpictures) { 
    350  
    351             $ids = $product->get_gallery_attachment_ids(); 
    352  
    353             if (!empty($ids)) { 
    354  
    355                 foreach ($ids as $id) { 
    356  
    357                     $image = wp_get_attachment_image_src($id, 'full'); 
    358  
    359                     if (!empty($image[0])) 
    360  
    361                         $images[] = WC_Shopybot_Functions::sanitize($image[0]); 
    362  
    363                 } 
    364  
    365             } 
    366         } 
    367  
    368         return $images; 
    369  
    370     } 
    371  
    372     /** 
    373      * Sets export params 
    374      */ 
    375     final public function setOfferParams($product) 
    376     { 
    377  
    378         $terms = wp_get_post_terms($product->id, 'product_cat'); 
    379  
    380         if (!empty($terms)) 
    381             $cat = $terms[0]->term_id; 
    382         else { 
    383             $this->bread('cat not set id=' . $product->id); 
    384             return false; 
    385         } 
    386  
    387         $excerpt = trim($product->post->post_excerpt); 
    388         $description = (!empty($excerpt)) ? $excerpt : $product->post->post_content; 
    389         $description = WC_Shopybot_Functions::substr($description, 500, false); 
    390  
    391         if ($this->vendors == false) 
    392             $vendor = get_post_meta($product->id, '_vendor', true); 
    393  
    394         else { 
    395  
    396             $terms = wp_get_post_terms($product->id, $this->vendors); 
    397  
    398             if (!is_wp_error($terms)) 
    399                 if (!empty($terms[0])) 
    400                     $vendor = $terms[0]->name; 
    401  
    402         } 
    403  
    404         if (empty($vendor)) 
    405             $vendor = get_option($this->id . '_def_vendor'); 
    406  
    407         if (empty($vendor)) 
    408             $vendor = 'none'; 
    409  
    410  
    411         $pictures = $this->getImagesProduct($product); 
    412  
    413         if (empty($pictures)) 
    414             return false; 
    415  
    416  
    417         $params = array( 
    418             'url' => WC_Shopybot_Functions::sanitize(urldecode(esc_attr($product->get_permalink()))), 
    419             'price' => $product->get_price(), 
    420             'currencyId' => $this->getWooCurrency(), 
    421             'categoryId' => $cat, 
    422             'picture' => $pictures, 
    423             'store' => ($this->isdeliver and !$this->cpa) ? $this->isstore : '', 
    424             'pickup' => ($this->isdeliver and !$this->cpa) ? $this->ispickup : '', 
    425             'delivery' => ($this->isdeliver and !$this->cpa) ? 'true' : '', 
    426             'vendor' => $vendor, 
    427             'name' => WC_Shopybot_Functions::del_symvol(strip_tags($product->post->post_title)), 
    428             'description' => WC_Shopybot_Functions::del_symvol(strip_tags($description)), 
    429             'sales_notes' => (!empty($this->salesNote)) ? WC_Shopybot_Functions::substr($this->salesNote, 50, false) : '', 
    430             'cpa' => ($this->cpa) ? $this->cpa : '', 
    431         ); 
    432  
    433  
    434         $params = apply_filters($this->id . '_set_offer_params', $params, $product); 
    435  
    436         if (empty($params['vendor'])) { 
    437             $this->bread('vendor not set id=' . $product->id); 
    438             return false; 
    439         } 
    440  
    441         if (empty($params['name'])) { 
    442             $this->bread('name not set id=' . $product->id); 
    443             return false; 
    444         } 
    445  
    446  
    447         if ($params['price'] == 0) 
    448             return false; 
    449  
    450  
    451         $params['sales_notes'] = WC_Shopybot_Functions::substr($params['sales_notes'], 50, false); 
    452  
    453         return $params; 
    454     } 
    455  
    456  
    457     /** 
    458      * Exports page of the products 
    459      */ 
    460     final public function renderPartOffers() 
    461     { 
    462         $products = $this->makeQuery(); 
    463  
    464         if ($products->post_count == $products->found_posts) 
    465             $this->yaml_finished = true; 
    466  
    467         if ($products->have_posts()) { 
    468  
    469             $this->bread('found posts'); 
    470  
    471             while ($products->have_posts()) { 
    472  
    473                 $products->the_post(); 
    474                 $product = get_product($products->post->ID); 
    475  
    476                 if ($product->product_type == 'simple' || $product->product_type == 'variation') { 
    477  
    478                     //не нужно включать вариации, у которых нет отличий от основного товара и других вариаций 
    479                     if ($product->product_type == 'variation') { 
    480  
    481                         if (!$this->checkVariationUniqueness($product)) { 
    482  
    483                             delete_post_meta($product->variation_id, $this->id . '_yml_offer'); 
    484                             $this->bread('WARNING: skipping product variation ID ' . $product->variation_id . ' (product ID ' . $product->id . ') — variation has no unique attributes'); 
    485                             continue; 
    486  
    487                         } 
    488  
    489                     } 
    490  
    491                     $this->renderPartOffer($product); 
    492  
    493                 } 
    494  
    495             } 
    496  
    497             wp_reset_postdata(); 
    498  
    499             $this->setPage($this->currentpage + 1); 
    500  
    501         } else { 
    502             $this->bread('no have posts'); 
    503             $this->yaml_finished = true; 
    504         } 
    505  
    506  
    507     } 
    508  
    509     final public function renderPartOffer($product) 
    510     { 
    511         $param = $this->setOfferParams($product); 
    512  
    513         if ($product->product_type == 'variation') { 
    514             $product_id = $product->variation_id; 
    515         } else 
    516             $product_id = $product->id; 
    517  
    518  
    519         if (!empty($param)) { 
    520             $offer = ''; 
    521  
    522             $available = ($product->is_in_stock() == 'instock') ? "true" : "false"; 
    523             $available = apply_filters($this->id . '_set_offer_param_available', $available, $product); 
    524  
    525             if ($this->isbid == true) 
    526                 $bid = ($this->bid) ? 'bid="' . $this->bid . '"' : ''; 
    527             else 
    528                 $bid = ""; 
    529  
    530             $offer .= '<offer id="' . $product_id . '" type="vendor.model" available="' . $available . '" ' . $bid; 
    531  
    532             if ($product->product_type == 'variation' && $this->isgroupidattr && isset($product->parent->id)) 
    533                 $offer .= ' group_id="' . $product->parent->id . '"'; 
    534  
    535  
    536             $offer .= '>' . "\n"; 
    537  
    538             foreach ($param as $key => $value) { 
    539  
    540                 if (!empty($value)) { 
    541  
    542                     if (is_array($value)) { 
    543  
    544                         foreach ($value as $values) { 
    545                             $offer .= "<$key>" . $values . "</$key>\n"; 
    546                         } 
    547  
    548                     } else { 
    549                         $offer .= "<$key>" . $value . "</$key>\n"; 
    550                     } 
    551  
    552                 } 
    553  
    554             } 
    555  
    556             if ($this->isexportattr) { 
    557                 $offer .= $this->getProductAttributes($product); 
    558             } 
    559  
    560             $offer .= '</offer>' . "\n"; 
    561  
    562             if (!empty($offer)) { 
    563  
    564                 $md5offer = md5($offer); 
    565  
    566                 if (!in_array($md5offer, $this->md5offer)) { 
    567  
    568  
    569                     $this->md5offer[] = $md5offer; 
    570  
    571                     update_post_meta($product_id, $this->id . '_yml_offer', $offer); 
    572  
    573                     return true; 
    574  
    575                 } 
    576             } else { 
    577                 update_post_meta($product_id, $this->id . '_yml_offer', ''); 
    578                 return false; 
    579             } 
    580  
    581         } else { 
    582             update_post_meta($product_id, $this->id . '_yml_offer', ''); 
    583             return false; 
    584         } 
    585     } 
    586  
    587     /** 
    588      * Check variation 
    589      */ 
    590     final public function checkVariationUniqueness($variation) 
    591     { 
    592  
    593         $product = get_product($variation->id); 
    594  
    595         if (!is_object($product) || !($product instanceof WC_Product_Variable)) 
    596             return false; 
    597  
    598         if (method_exists($product, 'get_children')) 
    599             $children = $product->get_children(); 
    600         else 
    601             return false; 
    602  
    603         $differs = false; 
    604         $pairs_differ = array(); 
    605  
    606         foreach ($children as $_id) { 
    607  
    608             $_variation = get_product($_id); 
    609  
    610             if ($_variation->variation_id == $variation->variation_id) 
    611                 continue; 
    612  
    613  
    614             $pair_differs = false; 
    615  
    616             foreach ($variation->variation_data as $attr => $value) { 
    617  
    618                 foreach ($_variation->variation_data as $attr_compare => $value_compare) { 
    619  
    620                     if ($attr === $attr_compare && $value !== $value_compare) { 
    621                         $pair_differs = true; 
    622                         break; 
    623                     } 
    624  
    625                 } 
    626  
    627                 if ($pair_differs) 
    628                     break; 
    629  
    630             } 
    631  
    632             $pairs_differ[] = $pair_differs; 
    633  
    634         } 
    635  
    636         $differs = in_array(false, $pairs_differ) ? false : true; 
    637  
    638         return $differs; 
    639  
    640     } 
    641  
    642     final public function getShellArg() 
    643     { 
    644         $shell_arg = @getopt("", array("wooexportyml_" . $this->shellPrefix . "::", "debug::", "unlock::", 'fullexport::', "unittests::")); 
    645  
    646         if (empty($shell_arg)) { 
    647             $shell_arg = array(); 
    648         } else { 
    649             $shell_arg = array_keys($shell_arg); 
    650         } 
    651  
    652         return $shell_arg; 
    653     } 
    654  
    655     /** 
    656      * shell params 
    657      * attrs: 
    658      * --wooexportyml - required, main key 
    659      * --debug        - optional, show debug info 
    660      * --unlock       - optoinal, unlocks the export 
    661      * --fullexport   - optional, full export, not paginated 
    662      */ 
    663     public function shell() 
    664     { 
    665         global $wpdb; 
    666  
    667         $shell_arg = $this->getShellArg(); 
    668  
    669         if (in_array('wooexportyml_' . $this->shellPrefix, $shell_arg)) { 
    670             if (in_array('unlock', $shell_arg)) { 
    671                 $this->action_unlock(); 
    672                 die; 
    673             } 
    674  
    675             if (in_array('debug', $shell_arg)) { 
    676                 $this->debugOn(); 
    677             } 
    678  
    679             $this->action_fullexport(); 
    680             die; 
    681         } 
    682     } 
    683  
    684     /** 
    685      * Unlocks the export 
    686      */ 
    687     public function action_unlock() 
    688     { 
    689         $this->inProcessSet('no'); 
    690         $this->setPage(1); 
    691         $this->exportUnlock(); 
    692     } 
    693  
    694     /** 
    695      * Full re-export, not paginated 
    696      */ 
    697     public function action_fullexport() 
    698     { 
    699         $this->inProcessSet('no'); 
    700         $this->setPage(1); 
    701         $this->exportUnlock(); 
    702  
    703         while (!$this->yaml_finished) { 
    704             $this->export(); 
    705         } 
    706     } 
    707  
    708     /** 
    709      * Main export function 
    710      */ 
    711     public function export() 
    712     { 
    713         if (!$this->isLock()) { 
    714  
    715             $this->exportLock(); 
    716  
    717             if ($this->inProcess()) { 
    718  
    719                 $this->bread('in process'); 
    720  
    721                 $this->renderPartOffers(); 
    722  
    723             } else { 
    724  
    725                 $this->bread('not in process'); 
    726  
    727  
    728                 $this->bread('check time true'); 
    729  
    730                 $this->inProcessSet('yes'); 
    731                 $this->renderPartOffers(); 
    732  
    733             } 
    734  
    735             if ($this->yaml_finished) { 
    736  
    737                 $this->bread('is yaml_finished true'); 
    738  
    739                 $this->inProcessSet('no'); 
    740                 $this->setPage(1); 
    741             } 
    742  
    743             $this->exportUnlock(); 
    744         } else { 
    745             $this->bread('process is lock'); 
    746         } 
    747     } 
    748  
    749  
    750     /** 
    751      * Renders YAML head 
    752      */ 
    753     final public function renderHead($arg) 
    754     { 
    755         extract($arg); 
    756         echo '<?xml version="1.0" encoding="utf-8"?> 
    757  
    758         <!DOCTYPE yml_catalog SYSTEM "shops.dtd"> 
    759         <yml_catalog date="' . date("Y-m-d H:i") . '"> 
    760             <shop> 
    761                 <name>' . $name . '</name> 
    762                 <company>' . $desc . '</company> 
    763                 <url>' . $siteurl . '</url> 
    764                 <currencies> 
    765                     ' . $this->renderCurrency() . ' 
    766                 </currencies> 
    767                 ' . $this->renderCats() . ' 
    768                 <offers> 
    769         '; 
    770  
    771     } 
    772  
    773  
    774     /** 
    775      * Renders YAML footer 
    776      */ 
    777     final public function renderFooter() 
    778     { 
    779         echo ' 
    780                 </offers> 
    781             </shop> 
    782         </yml_catalog> 
    783         '; 
    784  
    785     } 
    786  
    787     final public function renderOffers() 
    788     { 
    789         global $wpdb; 
    790  
    791         $ids = $this->getIdsForExport(); 
    792         $ids = implode(',', $ids->posts); 
    793  
    794         $offers = $wpdb->get_results("SELECT DISTINCT meta_value, post_id FROM {$wpdb->prefix}postmeta WHERE meta_key='" . $this->id . "_yml_offer' AND post_id IN ($ids)"); 
    795  
    796         foreach ($offers as $offer) { 
    797             echo apply_filters($this->id . '_renderOffers', $offer->meta_value, $offer->post_id); 
    798         } 
    799     } 
    800  
    801  
    802     /** 
    803      * Fetches offers from postmeta and generates YML file 
    804      */ 
    805     final public function getYml($gzip = false) 
    806     { 
    807         if ($gzip) { 
    808             header('Content-Type: application/gzip'); 
    809             ob_start(); 
    810         } else { 
    811             header("Content-Type:text/xml; charset=utf-8"); 
    812         } 
    813  
    814  
    815         $arg = array( 
    816             'name' => get_option('blogname'), 
    817             'desc' => get_option('blogdescription'), 
    818             'siteurl' => esc_attr(site_url()), 
    819 //            'this' => $this, 
    820         ); 
    821  
    822         $arg = apply_filters($this->id . '_make_yml_arg', $arg); 
    823  
    824         $this->renderHead($arg); 
    825         $this->renderOffers(); 
    826         $this->renderFooter(); 
    827  
    828         if ($gzip) { 
    829             WC_Shopybot_Functions::print_gzencode_output($this->id . '.xml.gz'); 
    830         } 
    831     } 
    832  
    833  
    834     final public function getIdsForExport() 
    835     { 
    836  
    837         $this->bread('Generate ids'); 
    838  
    839         $args = array( 
    840             'posts_per_page' => -1, 
    841             'post_status' => 'publish', 
    842             'post_type' => array('product'), 
    843             'fields' => 'ids', 
    844 //            'tax_query' => array( 
    845 //                array( 
    846 //                    'taxonomy' => 'product_type', 
    847 //                    'field' => 'slug', 
    848 //                    'terms' => array('simple', 'product_variation'), 
    849 //                ) 
    850 //            ), 
    851 //            'meta_query' => array( 
    852 //                array( 
    853 //                    'key' => '_price', 
    854 //                    'value' => '0', 
    855 //                    'compare' => '>', 
    856 //                ), 
    857 //            ) 
    858         ); 
    859  
    860  
    861         $relations = $this->getRelationsTax(); 
    862  
    863         foreach ($relations as $tax => $terms) { 
    864  
    865             if (!empty($terms)) { 
    866  
    867                 if (!in_array('all', $terms)) 
    868                     $args['tax_query'][] = array( 
    869                         'taxonomy' => $tax, 
    870                         'field' => 'term_id', 
    871                         'terms' => $terms 
    872                     ); 
    873  
    874                 else if ($tax == 'product_cat' and in_array('all', $terms)) { 
    875  
    876                     $get_terms = get_terms($tax); 
    877                     $terms = array(); 
    878  
    879                     foreach ($get_terms as $term) 
    880                         $terms[] = $term->term_id; 
    881  
    882                     $args['tax_query'][] = array( 
    883                         'taxonomy' => $tax, 
    884                         'field' => 'term_id', 
    885                         'terms' => $terms 
    886                     ); 
    887                 } 
    888  
    889             } 
    890         } 
    891  
    892  
    893         $args = apply_filters($this->id . '_make_query_get_ids', $args); 
    894         $products_ids = new WP_Query($args); 
    895  
    896         $variations_ids = $this->getVariationsIds(); 
    897  
    898         $ids = new WP_Query(); 
    899         $ids->posts = array_merge($products_ids->posts, $variations_ids->posts); 
    900         $ids->post_count = $products_ids->post_count + $variations_ids->post_count; 
    901  
    902         return $ids; 
    903     } 
    904  
    905     final public function getVariationsIds() 
    906     { 
    907  
    908         $args = array( 
    909             'posts_per_page' => -1, 
    910             'post_status' => 'publish', 
    911             'post_type' => array('product_variation'), 
    912             'fields' => 'ids', 
    913             'meta_query' => array( 
    914                 array( 
    915                     'key' => '_price', 
    916                     'value' => '0', 
    917                     'compare' => '>', 
    918                 ), 
    919             ) 
    920         ); 
    921  
    922         return new WP_Query($args); 
    923     } 
    924  
    925     /** 
    926      * Export DB query 
    927      */ 
    928     final public function makeQuery() 
    929     { 
    930  
    931         if ($this->currentpage == 1) { 
    932  
    933             $ids = $this->getIdsForExport(); 
    934             $this->posts = $ids->posts; 
    935             update_option($this->id . '_get_ids', $this->posts); 
    936         } 
    937  
    938  
    939         $this->bread('Current page - ' . $this->currentpage); 
    940  
    941         $shell_arg = $this->getShellArg(); 
    942  
    943         $perpage = (in_array('wooexportyml', $shell_arg)) ? 500 : 150; 
    944  
    945         $args = array( 
    946             'post__in' => (array)$this->posts, 
    947             'posts_per_page' => $perpage, 
    948             'paged' => $this->currentpage, 
    949             'post_type' => array('product', 'product_variation'), 
    950         ); 
    951  
    952         // Когда всего 200 товаров, нет смысла выгружать партиями. 
    953         if ((int)$get_ids->found_posts >= 200) { 
    954             $args['posts_per_page'] == 200; 
    955         } 
    956  
    957         $args = apply_filters($this->id . '_make_query_get_products', $args); 
    958  
    959         $query = new WP_Query($args); 
    960         update_option($this->id . '_pages', $query->max_num_pages); 
    961  
    962         return $query; 
    963     } 
    964  
    965  
    966     /** 
    967      * Get list of taxonomies 
    968      */ 
    969     final public function getRelationsTax() 
    970     { 
    971         $tax = get_taxonomies(array('object_type' => array('product')), 'objects'); 
    972  
    973         $relations = array(); 
    974  
    975         foreach ($tax as $key => $tax_val) { 
    976  
    977             if ($key == 'product_type') 
    978                 continue; 
    979  
    980             if (strripos($key, 'pa_') !== false) 
    981                 continue; 
    982  
    983             $relations[$key] = get_option($this->id . '_tax_' . $key); 
    984         } 
    985  
    986         if (!isset($relations['product_cat'])) 
    987             $relations['product_cat'] = array(); 
    988  
    989  
    990         $options = get_option($this->id . '_filters'); 
    991  
    992         if (!empty($options)) { 
    993             foreach ($options as $key => $value) { 
    994                 if (in_array('notfiltered', $value)) 
    995                     continue; 
    996  
    997                 $relations[$key] = $value; 
    998             } 
    999         } 
    1000  
    1001         return $relations; 
    1002     } 
    1003  
    1004  
    1005     public function ajaxUpdateOffers() 
    1006     { 
    1007         if ($_POST['unlock'] == 'yes') { 
    1008             $this->action_unlock(); 
    1009         } 
    1010  
    1011         $this->export(); 
    1012  
    1013         echo json_encode(array('yaml_finished' => $this->yaml_finished, 'bread' => $this->bread)); 
    1014         die; 
    1015     } 
    1016  
    1017     final public function generateOffer($meta_id, $post_id) 
    1018     { 
    1019  
    1020         $product = get_product($post_id); 
    1021         $this->renderPartOffer($product); 
    1022     } 
    1023  
    1024     final public function wp_insert_post($post_id, $post) 
    1025     { 
    1026  
    1027         if ($post->post_type == 'product') { 
    1028  
    1029             $product = get_product($post_id); 
    1030  
    1031             $this->renderPartOffer($product); 
    1032         } 
    1033  
    1034     } 
    1035  
    1036     final public function set_object_terms($post_id) 
    1037     { 
    1038  
    1039         $post = get_post($post_id); 
    1040  
    1041         if ($post->post_type == 'product') { 
    1042  
    1043             $product = get_product($post_id); 
    1044  
    1045             $this->renderPartOffer($product); 
    1046         } 
    1047  
    1048     } 
    1049  
    1050     /** 
    1051      * @return mixed|void 
    1052      */ 
    1053     private function getWooCurrency() 
    1054     { 
    1055         return apply_filters('woocommerce_currency', get_option('woocommerce_currency')); 
    1056     } 
    1057  
     737    <!DOCTYPE yml_catalog SYSTEM "shops.dtd"> 
     738    <yml_catalog date="' . date( "Y-m-d H:i" ) . '"> 
     739    <shop> 
     740    <name>' . $name . '</name> 
     741    <company>' . $desc . '</company> 
     742    <url>' . $siteurl . '</url> 
     743    <currencies> 
     744    ' . $this->renderCurrency() . ' 
     745    </currencies> 
     746    ' . $this->renderCats() . ' 
     747    <offers> 
     748    '; 
     749         
     750    } 
     751     
     752     
     753    /** 
     754     * Renders YAML footer 
     755     */ 
     756    final public function renderFooter() { 
     757        echo ' 
     758    </offers> 
     759    </shop> 
     760    </yml_catalog> 
     761    '; 
     762         
     763    } 
     764     
     765    final public function renderOffers() { 
     766        global $wpdb; 
     767         
     768        $ids = $this->getIdsForExport(); 
     769        $ids = implode( ',', $ids->posts ); 
     770         
     771        $offers = $wpdb->get_results( "SELECT DISTINCT meta_value, post_id FROM {$wpdb->prefix}postmeta WHERE meta_key='" . $this->id . "_yml_offer' AND post_id IN ($ids)" ); 
     772         
     773        foreach ( $offers as $offer ) { 
     774            echo apply_filters( $this->id . '_renderOffers', $offer->meta_value, $offer->post_id ); 
     775        } 
     776    } 
     777     
     778     
     779    /** 
     780     * Fetches offers from postmeta and generates YML file 
     781     */ 
     782    final public function getYml( $gzip = false ) { 
     783        if ( $gzip ) { 
     784            header( 'Content-Type: application/gzip' ); 
     785            ob_start(); 
     786        } else { 
     787            header( "Content-Type:text/xml; charset=utf-8" ); 
     788        } 
     789         
     790         
     791        $arg = array( 
     792            'name'    => get_option( 'blogname' ), 
     793            'desc'    => get_option( 'blogdescription' ), 
     794            'siteurl' => esc_attr( site_url() ), 
     795            //            'this' => $this, 
     796        ); 
     797         
     798        $arg = apply_filters( $this->id . '_make_yml_arg', $arg ); 
     799         
     800        $this->renderHead( $arg ); 
     801        $this->renderOffers(); 
     802        $this->renderFooter(); 
     803         
     804        if ( $gzip ) { 
     805            WC_Shopybot_Functions::print_gzencode_output( $this->id . '.xml.gz' ); 
     806        } 
     807    } 
     808     
     809     
     810    final public function getIdsForExport() { 
     811         
     812        $this->bread( 'Generate ids' ); 
     813         
     814        $args = array( 
     815            'posts_per_page' => - 1, 
     816            'post_status'    => 'publish', 
     817            'post_type'      => array( 'product' ), 
     818            'fields'         => 'ids', 
     819            //            'tax_query' => array( 
     820            //                array( 
     821            //                    'taxonomy' => 'product_type', 
     822            //                    'field' => 'slug', 
     823            //                    'terms' => array('simple', 'product_variation'), 
     824            //                ) 
     825            //            ), 
     826            //            'meta_query' => array( 
     827            //                array( 
     828            //                    'key' => '_price', 
     829            //                    'value' => '0', 
     830            //                    'compare' => '>', 
     831            //                ), 
     832            //            ) 
     833        ); 
     834         
     835         
     836        $relations = $this->getRelationsTax(); 
     837         
     838        foreach ( $relations as $tax => $terms ) { 
     839             
     840            if ( ! empty( $terms ) ) { 
     841                 
     842                if ( ! in_array( 'all', $terms ) ) { 
     843                    $args['tax_query'][] = array( 
     844                        'taxonomy' => $tax, 
     845                        'field'    => 'term_id', 
     846                        'terms'    => $terms 
     847                    ); 
     848                } else if ( $tax == 'product_cat' and in_array( 'all', $terms ) ) { 
     849                     
     850                    $get_terms = get_terms( $tax ); 
     851                    $terms     = array(); 
     852                     
     853                    foreach ( $get_terms as $term ) { 
     854                        $terms[] = $term->term_id; 
     855                    } 
     856                     
     857                    $args['tax_query'][] = array( 
     858                        'taxonomy' => $tax, 
     859                        'field'    => 'term_id', 
     860                        'terms'    => $terms 
     861                    ); 
     862                } 
     863                 
     864            } 
     865        } 
     866         
     867         
     868        $args         = apply_filters( $this->id . '_make_query_get_ids', $args ); 
     869        $products_ids = new WP_Query( $args ); 
     870         
     871        $variations_ids = $this->getVariationsIds(); 
     872         
     873        $ids             = new WP_Query(); 
     874        $ids->posts      = array_merge( $products_ids->posts, $variations_ids->posts ); 
     875        $ids->post_count = $products_ids->post_count + $variations_ids->post_count; 
     876         
     877        return $ids; 
     878    } 
     879     
     880    final public function getVariationsIds() { 
     881         
     882        $args = array( 
     883            'posts_per_page' => - 1, 
     884            'post_status'    => 'publish', 
     885            'post_type'      => array( 'product_variation' ), 
     886            'fields'         => 'ids', 
     887            'meta_query'     => array( 
     888                array( 
     889                    'key'     => '_price', 
     890                    'value'   => '0', 
     891                    'compare' => '>', 
     892                ), 
     893            ) 
     894        ); 
     895         
     896        return new WP_Query( $args ); 
     897    } 
     898     
     899    /** 
     900     * Export DB query 
     901     */ 
     902    final public function makeQuery() { 
     903         
     904        if ( $this->currentpage == 1 ) { 
     905             
     906            $ids         = $this->getIdsForExport(); 
     907            $this->posts = $ids->posts; 
     908            update_option( $this->id . '_get_ids', $this->posts ); 
     909        } 
     910         
     911         
     912        $this->bread( 'Current page - ' . $this->currentpage ); 
     913         
     914        $shell_arg = $this->getShellArg(); 
     915         
     916        $perpage = ( in_array( 'wooexportyml', $shell_arg ) ) ? 500 : 150; 
     917         
     918        $args = array( 
     919            'post__in'       => (array) $this->posts, 
     920            'posts_per_page' => $perpage, 
     921            'paged'          => $this->currentpage, 
     922            'post_type'      => array( 'product', 'product_variation' ), 
     923        ); 
     924         
     925        // Когда всего 200 товаров, нет смысла выгружать партиями. 
     926        if ( (int) $get_ids->found_posts >= 200 ) { 
     927            $args['posts_per_page'] == 200; 
     928        } 
     929         
     930        $args = apply_filters( $this->id . '_make_query_get_products', $args ); 
     931         
     932        $query = new WP_Query( $args ); 
     933        update_option( $this->id . '_pages', $query->max_num_pages ); 
     934         
     935        return $query; 
     936    } 
     937     
     938     
     939    /** 
     940     * Get list of taxonomies 
     941     */ 
     942    final public function getRelationsTax() { 
     943        $tax = get_taxonomies( array( 'object_type' => array( 'product' ) ), 'objects' ); 
     944         
     945        $relations = array(); 
     946         
     947        foreach ( $tax as $key => $tax_val ) { 
     948             
     949            if ( $key == 'product_type' ) { 
     950                continue; 
     951            } 
     952             
     953            if ( strripos( $key, 'pa_' ) !== false ) { 
     954                continue; 
     955            } 
     956             
     957            $relations[ $key ] = get_option( $this->id . '_tax_' . $key ); 
     958        } 
     959         
     960        if ( ! isset( $relations['product_cat'] ) ) { 
     961            $relations['product_cat'] = array(); 
     962        } 
     963         
     964         
     965        $options = get_option( $this->id . '_filters' ); 
     966         
     967        if ( ! empty( $options ) ) { 
     968            foreach ( $options as $key => $value ) { 
     969                if ( in_array( 'notfiltered', $value ) ) { 
     970                    continue; 
     971                } 
     972                 
     973                $relations[ $key ] = $value; 
     974            } 
     975        } 
     976         
     977        return $relations; 
     978    } 
     979     
     980     
     981    public function ajaxUpdateOffers() { 
     982        if ( $_POST['unlock'] == 'yes' ) { 
     983            $this->action_unlock(); 
     984        } 
     985         
     986        $this->export(); 
     987         
     988        echo json_encode( array( 'yaml_finished' => $this->yaml_finished, 'bread' => $this->bread ) ); 
     989        die; 
     990    } 
     991     
     992    final public function generateOffer( $meta_id, $post_id ) { 
     993         
     994        $product = get_product( $post_id ); 
     995        $this->renderPartOffer( $product ); 
     996    } 
     997     
     998    final public function wp_insert_post( $post_id, $post ) { 
     999        if ( $post->post_type == 'product' ) { 
     1000            $product = get_product( $post_id ); 
     1001            $this->renderPartOffer( $product ); 
     1002        } 
     1003    } 
     1004     
     1005    final public function set_object_terms( $post_id ) { 
     1006        $post = get_post( $post_id ); 
     1007         
     1008        if ( $post->post_type == 'product' ) { 
     1009            $product = get_product( $post_id ); 
     1010            $this->renderPartOffer( $product ); 
     1011        } 
     1012         
     1013    } 
     1014     
     1015    /** 
     1016     * @return mixed|void 
     1017     */ 
     1018    private function getWooCurrency() { 
     1019        return apply_filters( 'woocommerce_currency', get_option( 'woocommerce_currency' ) ); 
     1020    } 
     1021     
    10581022} 
  • shopybot-woocommerce/trunk/includes/class-wc-shopybot-functions.php

    r1720404 r1794644  
    22 
    33 
    4 class WC_Shopybot_Functions 
    5 { 
     4class WC_Shopybot_Functions { 
    65 
     6    public static function substr( $text, $max, $removelastword = true ) { 
    77 
    8     public static function substr($text, $max, $removelastword = true) 
    9     { 
     8        $text = mb_substr( $text, 0, $max ); 
    109 
    11         $text = mb_substr($text, 0, $max); 
     10        if ( $removelastword ) { 
     11            $text = explode( '. ', $text ); 
     12            unset( $text[ count( $text ) - 1 ] ); 
     13            $text = implode( '. ', $text ); 
     14        } 
    1215 
    13         if ($removelastword) { 
    14             $text = explode('. ', $text); 
    15             unset($text[count($text) - 1]); 
    16             $text = implode('. ', $text); 
    17         } 
     16        return $text; 
     17    } 
    1818 
    19         return $text; 
    20     } 
     19    public static function sanitize( $url ) { 
    2120 
    22     public static function sanitize($url) 
    23     { 
     21        if ( empty( $url ) ) { 
     22            return false; 
     23        } 
    2424 
    25         if (empty($url)) 
    26             return false; 
     25        $_p = explode( '/', str_replace( home_url( '/' ), "", $url ) ); 
     26        $_a = array(); 
    2727 
    28         $_p = explode('/', str_replace(home_url('/'), "", $url)); 
    29         $_a = array(); 
     28        foreach ( $_p as $v_ulr ) { 
     29            $_a[] = rawurlencode( $v_ulr ); 
     30        } 
    3031 
    31         foreach ($_p as $v_ulr) { 
    32             $_a[] = rawurlencode($v_ulr); 
    33         } 
     32        $_u = home_url( '/' ) . implode( '/', $_a ); 
    3433 
    35         $_u = home_url('/') . implode('/', $_a); 
     34        return $_u; 
     35    } 
    3636 
    37         return $_u; 
    38     } 
     37    public static function del_symvol( $str ) { 
    3938 
    40     public static function del_symvol($str) 
    41     { 
     39        $tr = array( 
     40            ";"  => " ", 
     41            ":"  => " ", 
     42            ">"  => " ", 
     43            "«"  => " ", 
     44            "»"  => " ", 
     45            "\"" => " ", 
     46            "@"  => " ", 
     47            "#"  => " ", 
     48            "$"  => " ", 
     49            "*"  => " ", 
     50            "%"  => " ", 
     51            "&"  => " " 
     52        ); 
    4253 
    43         $tr = array( 
    44             ";" => " ", ":" => " ", ">" => " ", "«" => " ", 
    45             "»" => " ", "\"" => " ", "@" => " ", "#" => " ", "$" => " ", 
    46             "*" => " ", "%" => " ", "&" => " " 
    47         ); 
     54        return strtr( $str, $tr ); 
     55    } 
    4856 
    49         return strtr($str, $tr); 
    50     } 
     57    public function print_gzencode_output( $filename ) { 
    5158 
    52     public function print_gzencode_output($filename) 
    53     { 
     59        $contents = ob_get_clean(); 
    5460 
    55         $contents = ob_get_clean(); 
     61        header( 'Content-Disposition: attachment; filename="' . $filename . '"' ); 
     62        header( 'Content-Encoding: gzip' ); 
     63        $contents = gzencode( $contents, 9 ); 
     64        print( $contents ); 
    5665 
    57         header('Content-Disposition: attachment; filename="' . $filename . '"'); 
    58         header('Content-Encoding: gzip'); 
    59         $contents = gzencode($contents, 9); 
    60         print($contents); 
    61  
    62     } 
     66    } 
    6367 
    6468} 
  • shopybot-woocommerce/trunk/includes/class-wc-shopybot-integration.php

    r1793884 r1794644  
    77 * @author   WooThemes 
    88 */ 
    9 if (!defined('ABSPATH')) { 
    10     exit; 
     9if ( ! defined( 'ABSPATH' ) ) { 
     10    exit; 
    1111} 
    1212 
    13  
    14 if (!class_exists('WC_Shopybot_Integration')) : 
    15  
    16     class WC_Shopybot_Integration extends WC_Integration 
    17     { 
    18  
    19         /** 
    20          * Init and hook in the integration. 
    21          */ 
    22         public function __construct() 
    23         { 
    24             global $woocommerce; 
    25             $this->shopybot_host = $this->shopybot_url(); 
    26  
    27             $this->id = 'shopybot-woocommerce'; 
    28             $this->method_title = __('Shopybot for WooCommerce', 'shopybot-woocommerce'); 
    29             $this->method_description = __('Create Facebook chatbot for your WooCommerce store in few clicks', 'shopybot-woocommerce'); 
    30             $this->export_filename = $this->id . '.xml'; 
    31  
    32             $this->shopybot_export = new WC_Shopybot_Export($this->id, array()); 
    33  
    34             $this->check_inbound_data(); 
    35             // Define user set variables. 
    36             $this->shopybot_api_key = get_option('shopybot_api_key'); 
    37             $this->shopybot_fb_page_id = get_option('shopybot_fb_page_id'); 
    38             $this->shopybot_fb_page_name = get_option('shopybot_fb_page_name'); 
    39  
    40             // Load the settings. 
    41             $this->init_form_fields(); 
    42             $this->init_settings(); 
    43  
    44             // Actions. 
    45             add_action('woocommerce_update_options_integration_' . $this->id, array($this, 'process_admin_options')); 
    46             add_action('wp_ajax_generate_export_url', array($this, 'generate_export_url')); 
    47  
    48             // Filters 
    49             add_filter('mod_rewrite_rules', array($this, 'add_htaccess_rule')); 
    50  
    51         } 
    52  
    53  
    54         public function add_htaccess_rule($rules) 
    55         { 
    56             $rules .= "RewriteRule ^" . $this->export_filename . " index.php\n"; 
    57             $rules .= "RewriteRule ^" . $this->export_filename . ".gz index.php\n"; 
    58  
    59             return $rules; 
    60         } 
    61  
    62  
    63         function generate_export_url() 
    64         { 
    65             global $wpdb; // this is how you get access to the database 
    66             $WC_Shopybot_Export = new WC_Shopybot_Export(); 
    67             $WC_Shopybot_Export->export(); 
    68             wp_die(); // this is required to terminate immediately and return a proper response 
    69         } 
    70  
    71  
    72         public function check_inbound_data() 
    73         { 
    74             if (isset($_GET["connect_data"]) && strlen($_GET["connect_data"]) > 0) { 
    75                 $data = json_decode(base64_decode($_GET["connect_data"]), true); 
    76                 if ($data) { 
    77                     update_option('shopybot_api_key', $data["shopybot_api_key"], $autoload = false); 
    78                     update_option('shopybot_shop_token', $data["shopybot_shop_token"], $autoload = false); 
    79                     update_option('shopybot_connect_fb_page_url', $data["shopybot_connect_fb_page_url"], $autoload = false); 
    80                     update_option('shopybot_connect_shop_url', $data["shopybot_connect_shop_url"], $autoload = false); 
    81                     update_option('shopybot_disconnect_shop_url', $data["shopybot_disconnect_shop_url"], $autoload = false); 
    82                     update_option('shopybot_disconnect_fb_page_url', $data["shopybot_disconnect_fb_page_url"], $autoload = false); 
    83  
    84                     add_action('admin_notices', 'shopybot_shop_connect_success'); 
    85                 } else { 
    86                     add_action('admin_notices', 'shopybot_shop_connect_error'); 
    87                 } 
    88  
    89             } 
    90             if (isset($_GET["disconnect_data"]) && strlen($_GET["disconnect_data"]) > 0) { 
    91                 $data = json_decode(base64_decode($_GET["disconnect_data"]), true); 
    92  
    93                 if ($data['bot_delete_result']['ok'] == 'bot_deleted') { 
    94                     delete_option('shopybot_api_key'); 
    95                     delete_option('shopybot_shop_token'); 
    96                     delete_option('shopybot_connect_fb_page_url'); 
    97                     delete_option('shopybot_connect_shop_url'); 
    98                     delete_option('shopybot_disconnect_shop_url'); 
    99                     delete_option('shopybot_disconnect_fb_page_url'); 
    100                     delete_option('shopybot_fb_page_id'); 
    101                     delete_option('shopybot_fb_page_name'); 
    102  
    103                     delete_option('shopybot-woocommerce_in_process'); 
    104                     delete_option('shopybot-woocommerce_page'); 
    105                     delete_option('shopybot-woocommerce_pages'); 
    106                     delete_option('shopybot-woocommerce_lock'); 
    107                     delete_option('shopybot-woocommerce_get_ids'); 
    108  
    109                     add_action('admin_notices', 'shopybot_shop_disconnect_success'); 
    110                 } else { 
    111                     add_action('admin_notices', 'shopybot_shop_disconnect_error'); 
    112                 } 
    113             } 
    114  
    115             if (isset($_GET["connect_fb_data"]) && strlen($_GET["connect_fb_data"]) > 0) { 
    116                 $data = json_decode(base64_decode(urldecode($_GET["connect_fb_data"])), true); 
    117  
    118                 update_option('shopybot_fb_page_name', $data["shopybot_fb_page_name"], $autoload = false); 
    119                 update_option('shopybot_fb_page_id', $data["shopybot_fb_page_id"], $autoload = false); 
    120                 add_action('admin_notices', function () { 
    121                     ?> 
    122                     <div class="notice notice-success is-dismissible"> 
    123                         <p><?php _e('Congratulations! You connected Facebook Page to your Bot', 'shopybot-woocommerce'); ?></p> 
    124                     </div> 
    125                     <?php 
    126                 }); 
    127             } 
    128  
    129             if (isset($_GET["disconnect_fb_data"]) && strlen($_GET["disconnect_fb_data"]) > 0) { 
    130                 $data = json_decode(base64_decode($_GET["disconnect_fb_data"]), true); 
    131  
    132                 $api_key = get_option('shopybot_api_key'); 
    133                 if ($api_key == $data['api_key']) { 
    134                     update_option('shopybot_fb_page_name', null, $autoload = false); 
    135                     update_option('shopybot_fb_page_id', null, $autoload = false); 
    136                     add_action('admin_notices', function () { 
    137                         ?> 
    138                         <div class="notice notice-success is-dismissible"> 
    139                             <p><?php _e('Congratulations! You disconnected Facebook Page from your Bot', 'shopybot-woocommerce'); ?></p> 
    140                         </div> 
    141                         <?php 
    142                     }); 
    143                 } else { 
    144                     add_action('admin_notices', function () { 
    145                         ?> 
    146                         <div class="notice notice-error is-dismissible"> 
    147                             <p><?php _e('Error! Cannot disconnect Facebook Page. Please contact support@shopybot.com', 'shopybot-woocommerce'); ?></p> 
    148                         </div> 
    149                         <?php 
    150                     }); 
    151                 } 
    152             } 
    153         } 
    154  
    155  
    156         /** 
    157          * Initialize integration settings form fields. 
    158          * 
    159          * @return void 
    160          */ 
    161         public function init_form_fields() 
    162         { 
    163             $store_name = $this->get_store_name(); 
    164  
    165             $this->form_fields = array(); 
    166  
    167             if ($this->shopybot_api_key) { 
    168                 if (!$this->shopybot_fb_page_id) { 
    169                     $data_array = array( 
    170                         'api_key' => $this->shopybot_api_key, 
    171                         'shop_token' => get_option('shopybot_shop_token'), 
    172                         'redirect_url' => get_site_url() . '/wp-admin/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce', 
    173                     ); 
    174  
    175                     $data = base64_encode(json_encode($data_array)); 
    176  
    177                     $this->form_fields['connect_facebook_page'] = array( 
    178                         'title' => __('Connect Facebook Page', 'shopybot-woocommerce'), 
    179                         'type' => 'button', 
    180                         'custom_attributes' => array( 
    181                             'onclick' => "javascript: shopybot_fb_connect('" . get_option('shopybot_connect_fb_page_url') . "?data=$data" . "');", 
    182                         ), 
    183                         'description' => __('Click to connect your store to shopybot.com.<br><small class="shopybot-well">This will opens a page on www.shopybot.com with all your Facebook pages available to connect.<br>If you do not have a Facebook Page - <a href="http://facebook.com/pages/create/?ref=shopybot" target="_blank">create it here</a></small>', 'shopybot-woocommerce'), 
    184                         'desc_tip' => false 
    185                     ); 
    186  
    187                 } else { 
    188  
    189                     $this->form_fields['facebook_page_link'] = array( 
    190                         'title' => __('Facebook Page', 'shopybot-woocommerce'), 
    191                         'type' => 'title', 
    192                         'description' => sprintf( 
    193                             __('<span class="shopybot-fb-page-name"><img src="http://graph.facebook.com/%s/picture?type=square"/> <span>%s</span></span><div class="shopybot-fb-buttons"><a target="_blank" href="%s" class="button-secondary shopybot-open-facebook-page">Open Facebook Page</a><br/><a target="_blank" href="%s" class="button-secondary shopybot-open-bot">Open Bot</a></div>', 'shopybot-woocommerce'), 
    194                             $this->shopybot_fb_page_id, 
    195                             $this->shopybot_fb_page_name, 
    196                             'https://www.facebook.com/' . $this->shopybot_fb_page_id, 
    197                             'https://m.me/' . $this->shopybot_fb_page_id 
    198                         ), 
    199                         'id' => 'export_url', 
    200                     ); 
    201  
    202                     $data_array = array( 
    203                         'api_key' => $this->shopybot_api_key, 
    204                         'shop_token' => get_option('shopybot_shop_token'), 
    205                         'redirect_url' => get_site_url() . '/wp-admin/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce', 
    206                     ); 
    207  
    208                     $data = base64_encode(json_encode($data_array)); 
    209  
    210                     $this->form_fields['disconnect_facebook_page'] = array( 
    211                         'title' => __('Disconnect Facebook Page', 'shopybot-woocommerce'), 
    212                         'type' => 'button', 
    213                         'custom_attributes' => array( 
    214                             'onclick' => "javascript: shopybot_fb_disconnect('" . get_option('shopybot_disconnect_fb_page_url') . "?data=$data" . "');", 
    215                         ), 
    216                         'description' => __('Click to disconnect your store from shopybot.com.<br> This will opens a page on www.shopybot.com, disconnects from current facebook page and return you back here', 'shopybot-woocommerce'), 
    217                         'desc_tip' => false 
    218                     ); 
    219                 } 
    220             } 
    221  
    222  
    223             if ($this->shopybot_api_key && $this->offers_ready()) { 
    224                 $this->form_fields['export_url'] = array( 
    225                     'title' => __('Export', 'shopybot-woocommerce'), 
    226                     'type' => 'title', 
    227                     'description' => sprintf( 
    228                         __( 
    229                             '<div id="shopybot-num-products"><strong>%s</strong> products ready for export</div>' . 
    230                             'Please use this URL to export your products into your Bot on shopybot.com: <a target="_blank" href="%s">%s</a>', 'shopybot-woocommerce' 
    231                         ), 
    232                         number_format($this->shopybot_export->numberOffers()), 
    233                         $this->export_url(), 
    234                         $this->export_url() 
    235                     ), 
    236                     'id' => 'export_url', 
    237                 ); 
    238                 $this->form_fields['generate_export_url'] = array( 
    239                     'title' => __('Re-generate Products for Export', 'shopybot-woocommerce'), 
    240                     'type' => 'button', 
    241                     'custom_attributes' => array( 
    242                         'onclick' => "return false", 
    243                     ), 
    244  
    245                     'description' => __( 
    246                         '<img class="shopybot-loading" src="' . plugins_url('/assets/img/loading.gif', dirname(__FILE__)) . '" />Click to re-generate Products for Export. This will take few minutes, depends on how many products you have.<br/>' . 
    247                         '<div id="shopybot-generate-progress"> <strong>Do not close the browser window during generation process!</strong></div>', 'shopybot-woocommerce'), 
    248                     'desc_tip' => false, 
    249                 ); 
    250             } elseif ($this->shopybot_api_key) { 
    251                 $this->form_fields['export_url'] = array( 
    252                     'title' => __('Export', 'shopybot-woocommerce'), 
    253                     'type' => 'title', 
    254                     'description' => __("You don't have export file. Please click button to generate it", 'shopybot-woocommerce'), 
    255                     'id' => 'export_url', 
    256                 ); 
    257                 $this->form_fields['generate_export_url'] = array( 
    258                     'title' => __('Generate Products for Export', 'shopybot-woocommerce'), 
    259                     'type' => 'button', 
    260                     'custom_attributes' => array( 
    261                         'onclick' => "return false", 
    262                     ), 
    263                     'description' => __('Click to generate Products for Export. This will take few minutes, depends on how many products you have.<br/> <div id="shopybot-generate-progress"><strong>Do not close the browser window during generation process!</strong><img class="shopybot-loading-gif" src="/wp-content/plugins/shopybot-woocommerce/assets/img/loading.gif" src-fallback="/wp-content/plugins/shopybot-woocommerce/assets/img/loading.gif" /></div>', 'shopybot-woocommerce'), 
    264                     'desc_tip' => false, 
    265                 ); 
    266  
    267             } 
    268  
    269             if (!$this->shopybot_api_key) { 
    270                 $data_array = array( 
    271                     'store_name' => $store_name, 
    272                     'store_description' => $this->get_store_description(), 
    273                     'products_export_url' => $this->export_url(), 
    274                     'store_crc' => md5(get_site_url()), 
    275                     'redirect_url' => get_site_url() . '/wp-admin/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce', 
    276                 ); 
    277  
    278                 $data = base64_encode(json_encode($data_array)); 
    279  
    280                 $this->form_fields['connect'] = array( 
    281                     'title' => __('Connect!', 'shopybot-woocommerce'), 
    282                     'type' => 'button', 
    283                     'custom_attributes' => array( 
    284                         'onclick' => "javascript: shopybot_connect('{$this->shopybot_host}/ecommerce/connect-shop?data=$data')", 
    285                     ), 
    286                     'description' => __('Click to connect your store to shopybot.com', 'shopybot-woocommerce'), 
    287                     'desc_tip' => false, 
    288                 ); 
    289  
    290             } else { 
    291                 $data_array = array( 
    292                     'api_key' => $this->shopybot_api_key, 
    293                     'redirect_url' => get_site_url() . '/wp-admin/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce', 
    294                 ); 
    295  
    296                 $data = base64_encode(json_encode($data_array)); 
    297  
    298                 $this->form_fields['disconnect'] = array( 
    299                     'title' => __('Disconnect', 'shopybot-woocommerce'), 
    300                     'type' => 'button', 
    301                     'custom_attributes' => array( 
    302                         'onclick' => "javascript: shopybot_disconnect('{$this->shopybot_host}/ecommerce/disconnect-shop?data=$data')", 
    303                     ), 
    304                     'description' => __('Click to disconnect your store from shopybot.com.<br><small class="shopybot-well">This will delete your Bot with all the products and statistics information on shopybot.com. <br><span style="color: red">WARNING! Irreversible procedure! But you can connect your store after that and import all your products</span> </small>', 'shopybot-woocommerce'), 
    305                     'desc_tip' => false, 
    306                 ); 
    307             } 
    308  
    309             $this->form_fields['contact_us'] = array( 
    310                 'title' => __('Contact us', 'shopybot-woocommerce'), 
    311                 'type' => 'title', 
    312                 'description' => __('Please contact us at <a href="mailto:support@shopybot.com">support@shopybot.com</a> if you have questions or suggestions.'), 
    313                 'id' => 'export_url', 
    314             ); 
    315  
    316         } 
    317  
    318  
    319         /** 
    320          * Get sanitized store name 
    321          * @return mixed|string 
    322          */ 
    323         private function get_store_name() 
    324         { 
    325             $name = trim(str_replace("'", "\u{2019}", html_entity_decode(get_bloginfo('name'), ENT_QUOTES, 'UTF-8'))); 
    326             if ($name) { 
    327                 return $name; 
    328             } 
    329             // Fallback to site url 
    330             $url = get_site_url(); 
    331             if ($url) { 
    332                 return parse_url($url, PHP_URL_HOST); 
    333             } 
    334             // If site url doesn't exist, fall back to http host. 
    335             if ($_SERVER['HTTP_HOST']) { 
    336                 return $_SERVER['HTTP_HOST']; 
    337             } 
    338  
    339             // If http host doesn't exist, fall back to local host name. 
    340             $url = gethostname(); 
    341             return ($url) ? $url : 'Please enter information'; 
    342         } 
    343  
    344         /** 
    345          * Get store description, sanitized 
    346          * @return mixed|string 
    347          */ 
    348         private function get_store_description() 
    349         { 
    350             $description = trim(str_replace("'", "\u{2019}", html_entity_decode(get_bloginfo('description'), ENT_QUOTES, 'UTF-8'))); 
    351             if ($description) { 
    352                 return $description; 
    353             } 
    354             return $this->get_store_name(); 
    355         } 
    356  
    357  
    358         /** 
    359          * Generate Button HTML. 
    360          */ 
    361         public function generate_button_html($key, $data) 
    362         { 
    363             $field = $this->plugin_id . $this->id . '_' . $key; 
    364             $defaults = array( 
    365                 'class' => 'button-secondary', 
    366                 'css' => '', 
    367                 'custom_attributes' => array(), 
    368                 'desc_tip' => false, 
    369                 'description' => '', 
    370                 'title' => '', 
    371             ); 
    372  
    373             $data = wp_parse_args($data, $defaults); 
    374  
    375             ob_start(); 
    376             ?> 
    377             <tr valign="top"> 
    378                 <th scope="row" class="titledesc"> 
    379                     <label for="<?php echo esc_attr($field); ?>"><?php echo wp_kses_post($data['title']); ?></label> 
    380                     <?php echo $this->get_tooltip_html($data); ?> 
    381                 </th> 
    382                 <td class="forminp"> 
    383                     <fieldset> 
    384                         <legend class="screen-reader-text"><span><?php echo wp_kses_post($data['title']); ?></span></legend> 
    385                         <button class="<?php echo esc_attr($data['class']); ?>" type="button" name="<?php echo esc_attr($field); ?>" 
    386                                 id="<?php echo esc_attr($field); ?>" 
    387                                 style="<?php echo esc_attr($data['css']); ?>" <?php echo $this->get_custom_attribute_html($data); ?>><?php echo wp_kses_post($data['title']); ?></button> 
    388                         <?php echo $this->get_description_html($data); ?> 
    389                     </fieldset> 
    390                 </td> 
    391             </tr> 
    392             <?php 
    393             return ob_get_clean(); 
    394         } 
    395  
    396  
    397         /** 
    398          * Validate the API key 
    399          * @see validate_settings_fields() 
    400          */ 
    401         public function validate_shopybot_api_key_field($key) 
    402         { 
    403             // get the posted value 
    404             $value = $_POST[$this->plugin_id . $this->id . '_' . $key]; 
    405  
    406             // check if the API key is longer than 20 characters. Our imaginary API doesn't create keys that large so something must be wrong. Throw an error which will prevent the user from saving. 
    407             if (isset($value) && 
    408                 20 < strlen($value) 
    409             ) { 
    410                 $this->errors[] = $key; 
    411             } 
    412             return $value; 
    413         } 
    414  
    415  
    416         /** 
    417          * Display errors by overriding the display_errors() method 
    418          * @see display_errors() 
    419          */ 
    420         public function display_errors() 
    421         { 
    422  
    423             // loop through each error and display it 
    424             foreach ($this->errors as $key => $value) { 
    425                 ?> 
    426                 <div class="error"> 
    427                     <p><?php _e('Looks like you made a mistake with the ' . $value . ' field. Make sure it isn&apos;t longer than 20 characters', 'shopybot-woocommerce'); ?></p> 
    428                 </div> 
    429                 <?php 
    430             } 
    431         } 
    432  
    433         private function export_url() 
    434         { 
    435             return get_site_url() . '/' . $this->export_filename; 
    436         } 
    437  
    438         private function shopybot_url() 
    439         { 
    440             if($_SERVER["SERVER_NAME"] == "shopybotshop.loc") { 
    441                 return "http://localhost:4000"; # dev settings 
    442             } else { 
    443                 return 'https://www.shopybot.com'; 
    444             } 
    445         } 
    446  
    447         private function offers_ready() 
    448         { 
    449             return ($this->shopybot_export->numberOffers() > 0) && !$this->export_file_generating(); 
    450         } 
    451  
    452         private function export_file_generating() 
    453         { 
    454             return $this->shopybot_export->isLock(); 
    455         } 
    456  
    457         /** 
    458          * @return string 
    459          */ 
    460         private function get_export_filename() 
    461         { 
    462             return wp_upload_dir()['basedir'] . '/' . $this->export_filename; 
    463         } 
    464  
    465         /** 
    466          * @return string 
    467          */ 
    468         private function get_export_filename_tmp() 
    469         { 
    470             return wp_upload_dir()['basedir'] . '/' . $this->export_filename_tmp; 
    471         } 
    472  
    473  
    474     } 
     13if ( ! class_exists( 'WC_Shopybot_Integration' ) ) : 
     14     
     15    class WC_Shopybot_Integration extends WC_Integration { 
     16         
     17        /** 
     18         * Init and hook in the integration. 
     19         */ 
     20        public function __construct() { 
     21            global $woocommerce; 
     22            $this->shopybot_host = $this->shopybot_url(); 
     23             
     24            $this->id                 = 'shopybot-woocommerce'; 
     25            $this->method_title       = __( 'Shopybot for WooCommerce', 'shopybot-woocommerce' ); 
     26            $this->method_description = __( 'Create Facebook chatbot for your WooCommerce store in few clicks', 'shopybot-woocommerce' ); 
     27            $this->export_filename    = $this->id . '.xml'; 
     28             
     29            $this->shopybot_export = new WC_Shopybot_Export( $this->id, array() ); 
     30             
     31            $this->check_inbound_data(); 
     32            // Define user set variables. 
     33            $this->shopybot_api_key      = get_option( 'shopybot_api_key' ); 
     34            $this->shopybot_fb_page_id   = get_option( 'shopybot_fb_page_id' ); 
     35            $this->shopybot_fb_page_name = get_option( 'shopybot_fb_page_name' ); 
     36             
     37            // Load the settings. 
     38            $this->init_form_fields(); 
     39            $this->init_settings(); 
     40             
     41            // Actions. 
     42            add_action( 'woocommerce_update_options_integration_' . $this->id, array( $this, 'process_admin_options' ) ); 
     43            add_action( 'wp_ajax_generate_export_url', array( $this, 'generate_export_url' ) ); 
     44             
     45            // Filters 
     46            add_filter( 'mod_rewrite_rules', array( $this, 'add_htaccess_rule' ) ); 
     47             
     48        } 
     49         
     50         
     51        public function add_htaccess_rule( $rules ) { 
     52            $rules .= "RewriteRule ^" . $this->export_filename . " index.php\n"; 
     53            $rules .= "RewriteRule ^" . $this->export_filename . ".gz index.php\n"; 
     54             
     55            return $rules; 
     56        } 
     57         
     58         
     59        function generate_export_url() { 
     60            global $wpdb; // this is how you get access to the database 
     61            $WC_Shopybot_Export = new WC_Shopybot_Export(); 
     62            $WC_Shopybot_Export->export(); 
     63            wp_die(); // this is required to terminate immediately and return a proper response 
     64        } 
     65         
     66         
     67        public function check_inbound_data() { 
     68            if ( isset( $_GET["connect_data"] ) && strlen( $_GET["connect_data"] ) > 0 ) { 
     69                $data = json_decode( base64_decode( $_GET["connect_data"] ), true ); 
     70                if ( $data ) { 
     71                    update_option( 'shopybot_api_key', $data["shopybot_api_key"], $autoload = false ); 
     72                    update_option( 'shopybot_shop_token', $data["shopybot_shop_token"], $autoload = false ); 
     73                    update_option( 'shopybot_connect_fb_page_url', $data["shopybot_connect_fb_page_url"], $autoload = false ); 
     74                    update_option( 'shopybot_connect_shop_url', $data["shopybot_connect_shop_url"], $autoload = false ); 
     75                    update_option( 'shopybot_disconnect_shop_url', $data["shopybot_disconnect_shop_url"], $autoload = false ); 
     76                    update_option( 'shopybot_disconnect_fb_page_url', $data["shopybot_disconnect_fb_page_url"], $autoload = false ); 
     77                     
     78                    add_action( 'admin_notices', 'shopybot_shop_connect_success' ); 
     79                } else { 
     80                    add_action( 'admin_notices', 'shopybot_shop_connect_error' ); 
     81                } 
     82                 
     83            } 
     84            if ( isset( $_GET["disconnect_data"] ) && strlen( $_GET["disconnect_data"] ) > 0 ) { 
     85                $data = json_decode( base64_decode( $_GET["disconnect_data"] ), true ); 
     86                 
     87                if ( $data['bot_delete_result']['ok'] == 'bot_deleted' ) { 
     88                    delete_option( 'shopybot_api_key' ); 
     89                    delete_option( 'shopybot_shop_token' ); 
     90                    delete_option( 'shopybot_connect_fb_page_url' ); 
     91                    delete_option( 'shopybot_connect_shop_url' ); 
     92                    delete_option( 'shopybot_disconnect_shop_url' ); 
     93                    delete_option( 'shopybot_disconnect_fb_page_url' ); 
     94                    delete_option( 'shopybot_fb_page_id' ); 
     95                    delete_option( 'shopybot_fb_page_name' ); 
     96                     
     97                    delete_option( 'shopybot-woocommerce_in_process' ); 
     98                    delete_option( 'shopybot-woocommerce_page' ); 
     99                    delete_option( 'shopybot-woocommerce_pages' ); 
     100                    delete_option( 'shopybot-woocommerce_lock' ); 
     101                    delete_option( 'shopybot-woocommerce_get_ids' ); 
     102                     
     103                    add_action( 'admin_notices', 'shopybot_shop_disconnect_success' ); 
     104                } else { 
     105                    add_action( 'admin_notices', 'shopybot_shop_disconnect_error' ); 
     106                } 
     107            } 
     108             
     109            if ( isset( $_GET["connect_fb_data"] ) && strlen( $_GET["connect_fb_data"] ) > 0 ) { 
     110                $data = json_decode( base64_decode( urldecode( $_GET["connect_fb_data"] ) ), true ); 
     111                 
     112                update_option( 'shopybot_fb_page_name', $data["shopybot_fb_page_name"], $autoload = false ); 
     113                update_option( 'shopybot_fb_page_id', $data["shopybot_fb_page_id"], $autoload = false ); 
     114                add_action( 'admin_notices', function () { 
     115                    ?> 
     116            <div class="notice notice-success is-dismissible"> 
     117                <p><?php _e( 'Congratulations! You connected Facebook Page to your Bot', 'shopybot-woocommerce' ); ?></p> 
     118            </div> 
     119                    <?php 
     120                } ); 
     121            } 
     122             
     123            if ( isset( $_GET["disconnect_fb_data"] ) && strlen( $_GET["disconnect_fb_data"] ) > 0 ) { 
     124                $data = json_decode( base64_decode( $_GET["disconnect_fb_data"] ), true ); 
     125                 
     126                $api_key = get_option( 'shopybot_api_key' ); 
     127                if ( $api_key == $data['api_key'] ) { 
     128                    update_option( 'shopybot_fb_page_name', null, $autoload = false ); 
     129                    update_option( 'shopybot_fb_page_id', null, $autoload = false ); 
     130                    add_action( 'admin_notices', function () { 
     131                        ?> 
     132              <div class="notice notice-success is-dismissible"> 
     133                  <p><?php _e( 'Congratulations! You disconnected Facebook Page from your Bot', 'shopybot-woocommerce' ); ?></p> 
     134              </div> 
     135                        <?php 
     136                    } ); 
     137                } else { 
     138                    add_action( 'admin_notices', function () { 
     139                        ?> 
     140              <div class="notice notice-error is-dismissible"> 
     141                  <p><?php _e( 'Error! Cannot disconnect Facebook Page. Please contact support@shopybot.com', 'shopybot-woocommerce' ); ?></p> 
     142              </div> 
     143                        <?php 
     144                    } ); 
     145                } 
     146            } 
     147        } 
     148         
     149         
     150        /** 
     151         * Initialize integration settings form fields. 
     152         * 
     153         * @return void 
     154         */ 
     155        public function init_form_fields() { 
     156            $store_name = $this->get_store_name(); 
     157             
     158            $this->form_fields = array(); 
     159             
     160            if ( $this->shopybot_api_key ) { 
     161                if ( ! $this->shopybot_fb_page_id ) { 
     162                    $data_array = array( 
     163                        'api_key'      => $this->shopybot_api_key, 
     164                        'shop_token'   => get_option( 'shopybot_shop_token' ), 
     165                        'redirect_url' => get_site_url() . '/wp-admin/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce', 
     166                    ); 
     167                     
     168                    $data = base64_encode( json_encode( $data_array ) ); 
     169                     
     170                    $this->form_fields['connect_facebook_page'] = array( 
     171                        'title'             => __( 'Connect Facebook Page', 'shopybot-woocommerce' ), 
     172                        'type'              => 'button', 
     173                        'custom_attributes' => array( 
     174                            'onclick' => "javascript: shopybot_fb_connect('" . get_option( 'shopybot_connect_fb_page_url' ) . "?data=$data" . "');", 
     175                        ), 
     176                        'description'       => __( 'Click to connect your store to shopybot.com.<br><small class="shopybot-well">This will opens a page on www.shopybot.com with all your Facebook pages available to connect.<br>If you do not have a Facebook Page - <a href="http://facebook.com/pages/create/?ref=shopybot" target="_blank">create it here</a></small>', 'shopybot-woocommerce' ), 
     177                        'desc_tip'          => false 
     178                    ); 
     179                     
     180                } else { 
     181                     
     182                    $this->form_fields['facebook_page_link'] = array( 
     183                        'title'       => __( 'Facebook Page', 'shopybot-woocommerce' ), 
     184                        'type'        => 'title', 
     185                        'description' => sprintf( 
     186                            __( '<span class="shopybot-fb-page-name"><img src="http://graph.facebook.com/%s/picture?type=square"/> <span>%s</span></span><div class="shopybot-fb-buttons"><a target="_blank" href="%s" class="button-secondary shopybot-open-facebook-page">Open Facebook Page</a><br/><a target="_blank" href="%s" class="button-secondary shopybot-open-bot">Open Bot</a></div>', 'shopybot-woocommerce' ), 
     187                            $this->shopybot_fb_page_id, 
     188                            $this->shopybot_fb_page_name, 
     189                            'https://www.facebook.com/' . $this->shopybot_fb_page_id, 
     190                            'https://m.me/' . $this->shopybot_fb_page_id 
     191                        ), 
     192                        'id'          => 'export_url', 
     193                    ); 
     194                     
     195                    $data_array = array( 
     196                        'api_key'      => $this->shopybot_api_key, 
     197                        'shop_token'   => get_option( 'shopybot_shop_token' ), 
     198                        'redirect_url' => get_site_url() . '/wp-admin/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce', 
     199                    ); 
     200                     
     201                    $data = base64_encode( json_encode( $data_array ) ); 
     202                     
     203                    $this->form_fields['disconnect_facebook_page'] = array( 
     204                        'title'             => __( 'Disconnect Facebook Page', 'shopybot-woocommerce' ), 
     205                        'type'              => 'button', 
     206                        'custom_attributes' => array( 
     207                            'onclick' => "javascript: shopybot_fb_disconnect('" . get_option( 'shopybot_disconnect_fb_page_url' ) . "?data=$data" . "');", 
     208                        ), 
     209                        'description'       => __( 'Click to disconnect your store from shopybot.com.<br> This will opens a page on www.shopybot.com, disconnects from current facebook page and return you back here', 'shopybot-woocommerce' ), 
     210                        'desc_tip'          => false 
     211                    ); 
     212                } 
     213            } 
     214             
     215             
     216            if ( $this->shopybot_api_key && $this->offers_ready() ) { 
     217                $this->form_fields['export_url']          = array( 
     218                    'title'       => __( 'Export', 'shopybot-woocommerce' ), 
     219                    'type'        => 'title', 
     220                    'description' => sprintf( 
     221                        __( 
     222                            '<div id="shopybot-num-products"><strong>%s</strong> products ready for export</div>' . 
     223                            'Please use this URL to export your products into your Bot on shopybot.com: <a target="_blank" href="%s">%s</a>', 'shopybot-woocommerce' 
     224                        ), 
     225                        number_format( $this->shopybot_export->numberOffers() ), 
     226                        $this->export_url(), 
     227                        $this->export_url() 
     228                    ), 
     229                    'id'          => 'export_url', 
     230                ); 
     231                $this->form_fields['generate_export_url'] = array( 
     232                    'title'             => __( 'Re-generate Products for Export', 'shopybot-woocommerce' ), 
     233                    'type'              => 'button', 
     234                    'custom_attributes' => array( 
     235                        'onclick' => "return false", 
     236                    ), 
     237                     
     238                    'description' => __( 
     239                        '<img class="shopybot-loading" src="' . plugins_url( '/assets/img/loading.gif', dirname( __FILE__ ) ) . '" />Click to re-generate Products for Export. This will take few minutes, depends on how many products you have.<br/>' . 
     240                        '<div id="shopybot-generate-progress"> <strong>Do not close the browser window during generation process!</strong></div>', 'shopybot-woocommerce' ), 
     241                    'desc_tip'    => false, 
     242                ); 
     243            } elseif ( $this->shopybot_api_key ) { 
     244                $this->form_fields['export_url']          = array( 
     245                    'title'       => __( 'Export', 'shopybot-woocommerce' ), 
     246                    'type'        => 'title', 
     247                    'description' => __( "You don't have export file. Please click button to generate it", 'shopybot-woocommerce' ), 
     248                    'id'          => 'export_url', 
     249                ); 
     250                $this->form_fields['generate_export_url'] = array( 
     251                    'title'             => __( 'Generate Products for Export', 'shopybot-woocommerce' ), 
     252                    'type'              => 'button', 
     253                    'custom_attributes' => array( 
     254                        'onclick' => "return false", 
     255                    ), 
     256                    'description'       => __( 'Click to generate Products for Export. This will take few minutes, depends on how many products you have.<br/> <div id="shopybot-generate-progress"><strong>Do not close the browser window during generation process!</strong><img class="shopybot-loading-gif" src="/wp-content/plugins/shopybot-woocommerce/assets/img/loading.gif" src-fallback="/wp-content/plugins/shopybot-woocommerce/assets/img/loading.gif" /></div>', 'shopybot-woocommerce' ), 
     257                    'desc_tip'          => false, 
     258                ); 
     259                 
     260            } 
     261             
     262            if ( ! $this->shopybot_api_key ) { 
     263                $data_array = array( 
     264                    'store_name'          => $store_name, 
     265                    'store_description'   => $this->get_store_description(), 
     266                    'products_export_url' => $this->export_url(), 
     267                    'store_crc'           => md5( get_site_url() ), 
     268                    'redirect_url'        => get_site_url() . '/wp-admin/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce', 
     269                ); 
     270                 
     271                $data = base64_encode( json_encode( $data_array ) ); 
     272                 
     273                $this->form_fields['connect'] = array( 
     274                    'title'             => __( 'Connect!', 'shopybot-woocommerce' ), 
     275                    'type'              => 'button', 
     276                    'custom_attributes' => array( 
     277                        'onclick' => "javascript: shopybot_connect('{$this->shopybot_host}/ecommerce/connect-shop?data=$data')", 
     278                    ), 
     279                    'description'       => __( 'Click to connect your store to shopybot.com', 'shopybot-woocommerce' ), 
     280                    'desc_tip'          => false, 
     281                ); 
     282                 
     283            } else { 
     284                $data_array = array( 
     285                    'api_key'      => $this->shopybot_api_key, 
     286                    'redirect_url' => get_site_url() . '/wp-admin/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce', 
     287                ); 
     288                 
     289                $data = base64_encode( json_encode( $data_array ) ); 
     290                 
     291                $this->form_fields['disconnect'] = array( 
     292                    'title'             => __( 'Disconnect', 'shopybot-woocommerce' ), 
     293                    'type'              => 'button', 
     294                    'custom_attributes' => array( 
     295                        'onclick' => "javascript: shopybot_disconnect('{$this->shopybot_host}/ecommerce/disconnect-shop?data=$data')", 
     296                    ), 
     297                    'description'       => __( 'Click to disconnect your store from shopybot.com.<br><small class="shopybot-well">This will delete your Bot with all the products and statistics information on shopybot.com. <br><span style="color: red">WARNING! Irreversible procedure! But you can connect your store after that and import all your products</span> </small>', 'shopybot-woocommerce' ), 
     298                    'desc_tip'          => false, 
     299                ); 
     300            } 
     301             
     302            $this->form_fields['contact_us'] = array( 
     303                'title'       => __( 'Contact us', 'shopybot-woocommerce' ), 
     304                'type'        => 'title', 
     305                'description' => __( 'Please contact us at <a href="mailto:support@shopybot.com">support@shopybot.com</a> if you have questions or suggestions.' ), 
     306                'id'          => 'export_url', 
     307            ); 
     308             
     309        } 
     310         
     311         
     312        /** 
     313         * Get sanitized store name 
     314         * @return mixed|string 
     315         */ 
     316        private function get_store_name() { 
     317            $name = trim( str_replace( "'", "\u{2019}", html_entity_decode( get_bloginfo( 'name' ), ENT_QUOTES, 'UTF-8' ) ) ); 
     318            if ( $name ) { 
     319                return $name; 
     320            } 
     321            // Fallback to site url 
     322            $url = get_site_url(); 
     323            if ( $url ) { 
     324                return parse_url( $url, PHP_URL_HOST ); 
     325            } 
     326            // If site url doesn't exist, fall back to http host. 
     327            if ( $_SERVER['HTTP_HOST'] ) { 
     328                return $_SERVER['HTTP_HOST']; 
     329            } 
     330             
     331            // If http host doesn't exist, fall back to local host name. 
     332            $url = gethostname(); 
     333             
     334            return ( $url ) ? $url : 'Please enter information'; 
     335        } 
     336         
     337        /** 
     338         * Get store description, sanitized 
     339         * @return mixed|string 
     340         */ 
     341        private function get_store_description() { 
     342            $description = trim( str_replace( "'", "\u{2019}", html_entity_decode( get_bloginfo( 'description' ), ENT_QUOTES, 'UTF-8' ) ) ); 
     343            if ( $description ) { 
     344                return $description; 
     345            } 
     346             
     347            return $this->get_store_name(); 
     348        } 
     349         
     350         
     351        /** 
     352         * Generate Button HTML. 
     353         */ 
     354        public function generate_button_html( $key, $data ) { 
     355            $field    = $this->plugin_id . $this->id . '_' . $key; 
     356            $defaults = array( 
     357                'class'             => 'button-secondary', 
     358                'css'               => '', 
     359                'custom_attributes' => array(), 
     360                'desc_tip'          => false, 
     361                'description'       => '', 
     362                'title'             => '', 
     363            ); 
     364             
     365            $data = wp_parse_args( $data, $defaults ); 
     366             
     367            ob_start(); 
     368            ?> 
     369        <tr valign="top"> 
     370            <th scope="row" class="titledesc"> 
     371                <label for="<?php echo esc_attr( $field ); ?>"><?php echo wp_kses_post( $data['title'] ); ?></label> 
     372                            <?php echo $this->get_tooltip_html( $data ); ?> 
     373            </th> 
     374            <td class="forminp"> 
     375                <fieldset> 
     376                    <legend class="screen-reader-text"><span><?php echo wp_kses_post( $data['title'] ); ?></span></legend> 
     377                    <button class="<?php echo esc_attr( $data['class'] ); ?>" type="button" name="<?php echo esc_attr( $field ); ?>" 
     378                            id="<?php echo esc_attr( $field ); ?>" 
     379                            style="<?php echo esc_attr( $data['css'] ); ?>" <?php echo $this->get_custom_attribute_html( $data ); ?>><?php echo wp_kses_post( $data['title'] ); ?></button> 
     380                                    <?php echo $this->get_description_html( $data ); ?> 
     381                </fieldset> 
     382            </td> 
     383        </tr> 
     384            <?php 
     385            return ob_get_clean(); 
     386        } 
     387         
     388         
     389        /** 
     390         * Validate the API key 
     391         * @see validate_settings_fields() 
     392         */ 
     393        public function validate_shopybot_api_key_field( $key ) { 
     394            // get the posted value 
     395            $value = $_POST[ $this->plugin_id . $this->id . '_' . $key ]; 
     396             
     397            // check if the API key is longer than 20 characters. Our imaginary API doesn't create keys that large so something must be wrong. Throw an error which will prevent the user from saving. 
     398            if ( isset( $value ) && 
     399                 20 < strlen( $value ) 
     400            ) { 
     401                $this->errors[] = $key; 
     402            } 
     403             
     404            return $value; 
     405        } 
     406         
     407         
     408        /** 
     409         * Display errors by overriding the display_errors() method 
     410         * @see display_errors() 
     411         */ 
     412        public function display_errors() { 
     413             
     414            // loop through each error and display it 
     415            foreach ( $this->errors as $key => $value ) { 
     416                ?> 
     417          <div class="error"> 
     418              <p><?php _e( 'Looks like you made a mistake with the ' . $value . ' field. Make sure it isn&apos;t longer than 20 characters', 'shopybot-woocommerce' ); ?></p> 
     419          </div> 
     420                <?php 
     421            } 
     422        } 
     423         
     424        private function export_url() { 
     425            return get_site_url() . '/' . $this->export_filename; 
     426        } 
     427         
     428        private function shopybot_url() { 
     429            if ( $_SERVER["SERVER_NAME"] == "shopybotshop.loc" ) { 
     430                return "http://localhost:4000"; # dev settings 
     431            } else { 
     432                return 'https://www.shopybot.com'; 
     433            } 
     434        } 
     435         
     436        private function offers_ready() { 
     437            return ( $this->shopybot_export->numberOffers() > 0 ) && ! $this->export_file_generating(); 
     438        } 
     439         
     440        private function export_file_generating() { 
     441            return $this->shopybot_export->isLock(); 
     442        } 
     443         
     444        /** 
     445         * @return string 
     446         */ 
     447        private function get_export_filename() { 
     448            return wp_upload_dir()['basedir'] . '/' . $this->export_filename; 
     449        } 
     450         
     451        /** 
     452         * @return string 
     453         */ 
     454        private function get_export_filename_tmp() { 
     455            return wp_upload_dir()['basedir'] . '/' . $this->export_filename_tmp; 
     456        } 
     457         
     458         
     459    } 
    475460 
    476461endif; 
  • shopybot-woocommerce/trunk/includes/class-wc-shopybot-notices.php

    r1720404 r1794644  
    77 * @author   WooThemes 
    88 */ 
    9 if (!defined('ABSPATH')) { 
    10     exit; 
     9if ( ! defined( 'ABSPATH' ) ) { 
     10    exit; 
    1111} 
    1212 
    1313 
    14 function shopybot_shop_connect_success() 
    15 { 
    16     ?> 
     14function shopybot_shop_connect_success() { 
     15    ?> 
    1716    <div class="notice notice-success is-dismissible"> 
    18         <p><?php _e('Congratulations! Your shop is now connected to Bot on shopybot.com!', 'shopybot-woocommerce'); ?></p> 
     17        <p><?php _e( 'Congratulations! Your shop is now connected to Bot on shopybot.com!', 'shopybot-woocommerce' ); ?></p> 
    1918    </div> 
    20     <?php 
     19    <?php 
    2120} 
    2221 
    23 function shopybot_shop_connect_error() 
    24 { 
    25     ?> 
     22function shopybot_shop_connect_error() { 
     23    ?> 
    2624    <div class="notice notice-error is-dismissible"> 
    27         <p><?php _e('Error! Cannot connect your store to Bot on shopybot. Please contact us at support@shopybot.com if you want to connect your store.', 'shopybot-woocommerce'); ?></p> 
     25        <p><?php _e( 'Error! Cannot connect your store to Bot on shopybot. Please contact us at support@shopybot.com if you want to connect your store.', 'shopybot-woocommerce' ); ?></p> 
    2826    </div> 
    29     <?php 
     27    <?php 
    3028} 
    3129 
    32 function shopybot_shop_disconnect_success() 
    33 { 
    34     ?> 
     30function shopybot_shop_disconnect_success() { 
     31    ?> 
    3532    <div class="notice notice-success is-dismissible"> 
    36         <p><?php _e('Congratulations! You disconnected your store and deleted your Bot successfully!', 'shopybot-woocommerce'); ?></p> 
     33        <p><?php _e( 'Congratulations! You disconnected your store and deleted your Bot successfully!', 'shopybot-woocommerce' ); ?></p> 
    3734    </div> 
    38     <?php 
     35    <?php 
    3936} 
    4037 
    41 function shopybot_shop_disconnect_error() 
    42 { 
    43     ?> 
     38function shopybot_shop_disconnect_error() { 
     39    ?> 
    4440    <div class="notice notice-error is-dismissible"> 
    45         <p><?php _e('Error occurred during the disconnection process. Please contact us at support@shopybot.com if you want to disconnect your store.', 'shopybot-woocommerce'); ?></p> 
     41        <p><?php _e( 'Error occurred during the disconnection process. Please contact us at support@shopybot.com if you want to disconnect your store.', 'shopybot-woocommerce' ); ?></p> 
    4642    </div> 
    47     <?php 
     43    <?php 
    4844} 
    4945 
    50 function shopybot_check_woocommerce_installation() 
    51 { 
    52     ?> 
     46function shopybot_check_woocommerce_installation() { 
     47    ?> 
    5348    <div class="notice notice-error is-dismissible"> 
    54         <p><?php _e('Please check whether you have WooCommerce installed', 'shopybot-woocommerce'); ?></p> 
     49        <p><?php _e( 'Please check whether you have WooCommerce installed', 'shopybot-woocommerce' ); ?></p> 
    5550    </div> 
    56     <?php 
     51    <?php 
    5752} 
    5853 
  • shopybot-woocommerce/trunk/readme.txt

    r1793885 r1794644  
    44Requires at least: 3.9 
    55Tested up to: 4.9.1 
    6 Stable tag: 1.0.1 
     6Stable tag: 1.0.2 
    77License: GNU GENERAL PUBLIC LICENSE Version 3 
    88License URI: http://www.gnu.org/licenses/gpl-3.0.html 
     
    105105== Changelog == 
    106106 
     107= 1.0.2 = 
     108Fixed generating product param and multiple images 
     109 
    107110= 1.0.1 = 
    108111Facebook login issue: Fixed shopybot domain name in the connect URLs 
  • shopybot-woocommerce/trunk/shopybot-woocommerce.php

    r1793883 r1794644  
    1010 * 
    1111 * @link              https://www.shopybot.com 
    12  * @since             1.0.1 
     12 * @since             1.0.2 
    1313 * @package           Shopybot_Chatbot_Woocommerce 
    1414 * 
     
    1717 * Plugin URI:        https://www.shopybot.com/connect-bot/woocommerce 
    1818 * Description:       Create Facebook Chatbot for your WooCommerce E-Store. Showcase with your products in the Facebook Messenger in a few clicks 
    19  * Version:           1.0.1 
     19 * Version:           1.0.2 
    2020 * Author:            Shopybot 
    2121 * Author URI:        https://www.shopybot.com 
     
    2727 
    2828 
    29 if (!class_exists('Shopybot_Woocommerce')) : 
     29if ( ! class_exists( 'Shopybot_Woocommerce' ) ) : 
    3030 
    31     class Shopybot_Woocommerce 
    32     { 
    33         /** 
    34          * Construct the plugin. 
    35          */ 
    36         public function __construct() 
    37         { 
    38             $this->id = 'shopybot-woocommerce'; 
    39             add_action('plugins_loaded', array($this, 'init')); 
    40         } 
     31    class Shopybot_Woocommerce { 
     32        /** 
     33         * Construct the plugin. 
     34         */ 
     35        public function __construct() { 
     36            $this->id = 'shopybot-woocommerce'; 
     37            add_action( 'plugins_loaded', array( $this, 'init' ) ); 
     38        } 
    4139 
    42         /** 
    43          * Initialize the plugin. 
    44          */ 
    45         public function init() 
    46         { 
    47             include_once 'includes/class-wc-shopybot-notices.php'; 
    48             include_once 'includes/class-wc-shopybot-functions.php'; 
     40        /** 
     41         * Initialize the plugin. 
     42         */ 
     43        public function init() { 
     44            include_once 'includes/class-wc-shopybot-notices.php'; 
     45            include_once 'includes/class-wc-shopybot-functions.php'; 
    4946 
    50             // Checks if WooCommerce is installed. 
    51             if (class_exists('WC_Integration')) { 
    52                 // Include our integration class. 
    53                 include_once 'includes/class-wc-shopybot-integration.php'; 
    54                 include_once 'includes/class-wc-shopybot-export.php'; 
     47            // Checks if WooCommerce is installed. 
     48            if ( class_exists( 'WC_Integration' ) ) { 
     49                // Include our integration class. 
     50                include_once 'includes/class-wc-shopybot-integration.php'; 
     51                include_once 'includes/class-wc-shopybot-export.php'; 
    5552 
    56                 // Register the integration. 
    57                 add_filter('woocommerce_integrations', array($this, 'add_integration')); 
     53                // Register the integration. 
     54                add_filter( 'woocommerce_integrations', array( $this, 'add_integration' ) ); 
    5855 
    59                 $this->shopybot_export = new WC_Shopybot_Export($this->id, array()); 
    60                 $this->shopybot_export->numberOffers(); 
     56                $this->shopybot_export = new WC_Shopybot_Export( $this->id, array() ); 
     57                $this->shopybot_export->numberOffers(); 
    6158 
    62                 $this->shopybot_admin_scripts(); 
     59                $this->shopybot_admin_scripts(); 
    6360 
    64             } else { 
    65                 add_action('admin_notices', 'shopybot_check_woocommerce_installation'); 
    66             } 
     61            } else { 
     62                add_action( 'admin_notices', 'shopybot_check_woocommerce_installation' ); 
     63            } 
    6764 
    68             add_filter('plugin_action_links_' . plugin_basename(__FILE__), array($this, 'add_action_links')); 
     65            add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'add_action_links' ) ); 
    6966 
     67        } 
    7068 
    71         } 
     69        function add_action_links( $links ) { 
     70            $mylinks = array( 
     71                '<a href="' . admin_url( '/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce' ) . '">Settings</a>', 
     72            ); 
    7273 
    73         function add_action_links($links) 
    74         { 
    75             $mylinks = array( 
    76                 '<a href="' . admin_url('/admin.php?page=wc-settings&tab=integration&section=shopybot-woocommerce') . '">Settings</a>', 
    77             ); 
    78             return array_merge($links, $mylinks); 
    79         } 
     74            return array_merge( $links, $mylinks ); 
     75        } 
    8076 
    81         /** 
    82          * Add a new integration to WooCommerce. 
    83          */ 
    84         public function add_integration($integrations) 
    85         { 
    86             array_unshift($integrations, 'WC_Shopybot_Integration'); 
    87             return $integrations; 
    88         } 
     77        /** 
     78         * Add a new integration to WooCommerce. 
     79         */ 
     80        public function add_integration( $integrations ) { 
     81            array_unshift( $integrations, 'WC_Shopybot_Integration' ); 
    8982 
    90         public function shopybot_admin_scripts() 
    91         { 
    92             if (is_admin()) { 
    93                 wp_register_script('shopybot-script', plugins_url('/assets/js/script.js', __FILE__), array('jquery'), '1.0', true); 
    94                 wp_enqueue_script('shopybot-script'); 
     83            return $integrations; 
     84        } 
    9585 
    96                 wp_register_style('shopybot-style', plugins_url('/assets/css/style.css', __FILE__), array('woocommerce_admin_styles'), '1.0', 'all'); 
    97                 wp_enqueue_style('shopybot-style'); 
    98             } 
    99         } 
     86        public function shopybot_admin_scripts() { 
     87            if ( is_admin() ) { 
     88                wp_register_script( 'shopybot-script', plugins_url( '/assets/js/script.js', __FILE__ ), array( 'jquery' ), '1.0', true ); 
     89                wp_enqueue_script( 'shopybot-script' ); 
    10090 
    101     } 
     91                wp_register_style( 'shopybot-style', plugins_url( '/assets/css/style.css', __FILE__ ), array( 'woocommerce_admin_styles' ), '1.0', 'all' ); 
     92                wp_enqueue_style( 'shopybot-style' ); 
     93            } 
     94        } 
    10295 
    103     $Shopybot_Woocommerce = new Shopybot_Woocommerce(); 
     96    } 
     97 
     98    $Shopybot_Woocommerce = new Shopybot_Woocommerce(); 
    10499 
    105100endif; 
Note: See TracChangeset for help on using the changeset viewer.