【问题标题】:Wordpress prodruct data scraper/APIWordpress 产品数据刮板/API
【发布时间】:2018-04-29 19:40:00
【问题描述】:

我想通过抓取其他网站或通过使用 cURL 访问 API 来自动从其他网站获取产品数据。由于我们的网站使用 Wordpress,我正在尝试制作一个插件。 我现在正在尝试在插件的设置页面上获取字段以填写网站名称、cURL 的链接格式和应导入的产品的 ID。插件的设置页面上会有一个按钮,单击时会再次添加相同的字段。我正在尝试使用带有对象的类,因为我想使用多个网站。 我在我们的网站上收到 HTTP 错误 500,所以我认为在我的代码中的“//**START 插件设置页面”部分之后做错了什么。如果有人审查我的代码并推动我朝着正确的方向前进,那就太好了:)。 我对 PHP 也很陌生,所以如果有关于如何使我的代码更具可读性或如何以更好的方式获取产品数据的提示,那就太好了!

亲切的问候, 马丁

<?php
/**
 * Plugin Name: Dropship Data Scraper
 * Plugin URI: http://example.com/
 * Description: This plugin scrapes data from websites and puts them in product pages
 * Version: 1.0.0
 * Author: Martijn
 * Author URI: https://example.com/
 * License: Proprietary
 */

//**START Adding custom fields to product options Inventory tab**
//Display Fields
add_action( 'woocommerce_product_options_inventory_product_data', 'woo_add_custom_general_fields' );

//Save Fields
add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' );

function woo_add_custom_general_fields() {

  global $woocommerce, $post;

  echo '<div class="options_group">';

  //Custom fields will be created here...
    //Purchase Price Field
    woocommerce_wp_text_input( 
        array( 
            'id'                => '_purchase_price', 
            'label'             => __( 'Purchase price', 'woocommerce' ), 
            'placeholder'       => '', 
            'desc_tip'                => 'true',
            'description'       => __( 'Enter the purchase price here.', 'woocommerce' ),
            'type'              => 'number', 
            'custom_attributes' => array(
                    'step'  => 'any',
                    'min'   => '0'
                ) 
        )
    );

    //Product Link Field
    woocommerce_wp_text_input( 
        array( 
            'id'          => '_product_link', 
            'label'       => __( 'Product link', 'woocommerce' ), 
            'placeholder' => 'http://',
            'desc_tip'    => 'true',
            'description' => __( 'Enter the product link from the supplier here.', 'woocommerce' ) 
        )
    );

  echo '</div>';
}

function woo_add_custom_general_fields_save( $post_id ){
    //Purchase Price Field
    $woocommerce_purchase_price = $_POST['_purchase_price'];
    if( !empty( $woocommerce_purchase_price ) )
        update_post_meta( $post_id, '_purchase_price', esc_attr( $woocommerce_purchase_price ) );
  elseif( empty( $woocommerce_purchase_price ) )
        update_post_meta( $post_id, '_purchase_price', NULL );

    //Product Link Field
    $woocommerce_product_link = $_POST['_product_link'];
    if( !empty( $woocommerce_product_link ) )
        update_post_meta( $post_id, '_product_link', esc_attr( $woocommerce_product_link ) );
  elseif( empty( $woocommerce_product_link ) )
        update_post_meta( $post_id, '_product_link', NULL );
}
//**END Adding custom fields to product options Inventory tab**

//**START Plugin Settings Page
//Settings page dropship ids class
class DropshipFields {
  public static $counter = 0;
  private $dropshipIds;

  //Constructor to count how many DropshipFields objects are created
  function __construct() {
     self::$counter++;
  }
  //function to register settings
  public function ff_dropship_data_scraper_settings() {
    $this->dropshipIds = "dropship-ids" . BaseClass::$counter;
    return register_setting( 'ff-dropship-data-scraper-settings-group', $this->dropshipIds );
  }
  //function to display the dropship fields in ff_dropship_data_scraper_settings_page()
  public function displayFields() {

  }
}

//Eventually I want to put here some code that makes a new object everytime a button is pushed on the settings page
$DropshipFields1 = new DropshipFields();

//Add menu item on admin side
  add_action('admin_menu', 'ff_dropship_data_scraper_menu');
  function ff_dropship_data_scraper_menu() {
    add_menu_page('FF Dropship Data Scraper Settings', 'FF Dropship Data Scraper Settings', 'administrator', 'ff-dropship-data-scraper-settings', 'ff_dropship_data_scraper_settings_page', '
dashicons-clipboard');
  }

  add_action( 'admin_init', 'ff_dropship_data_scraper_settings' );
  function ff_dropship_data_scraper_settings() {
    $DropshipFields1->ff_dropship_data_scraper_settings();
  }

  function ff_dropship_data_scraper_settings_page() { ?>
    <div class="wrap">
    <h1>Dropship data</h1>

    <form method="post" action="options.php">
        <?php settings_fields( 'ff-dropship-data-scraper-settings-group' ); ?>
        <?php do_settings_sections( 'ff-dropship-data-scraper-settings-group' ); ?>
        <table class="form-table">
            <tr valign="top">
            <th scope="row">Dropship IDs</th>
            <td><textarea placeholder="Your dropship product ids" name="dropship-ids" rows="5" cols="1000"><?php echo esc_attr( get_option('dropship-ids') ); ?></textarea></td>
            </tr>
        </table>

        <table class="form-table">
            <tr valign="top">
            <th scope="row">Dropship IDs</th>
            <td><textarea placeholder="Your dropship product ids" name="dropship-ids" rows="5" cols="1000"><?php echo esc_attr( get_option('dropship-ids') ); ?></textarea></td>
            </tr>
        </table>

        <?php submit_button(); ?>

    </form>
    </div>
  <?php }
//**END Plugin Settings Page

//**START cURL Scraper
foreach($colors as $value) {
  //Variables
  $url = "https://apibeta.banggood.com/getAccessToken?apiTest=1&apiTest=1app_id=&app_secret=";
  $json;

  //Initialize
  $ch = curl_init();

  //Set options
  //Url to send the request to
  curl_setopt($ch, CURLOPT_URL, $url);

  //Return instead of outputting directly
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

  //Include header in the output, set to false
  curl_setopt($ch, CURLOPT_HEADER, 0);

  //Execute the request and fetch the response. Check for errors
  $output = curl_exec($ch);

  if ($output === FALSE) {
    echo 'cURL ERROR: ' . curl_error($ch);
  }

  //Close and free up the cURL handle
  curl_close($ch);

  //decode json
  $json = json_decode($output, true);
}

//**END cURL Scraper

//**START creating, updating or deleting dropship products
//Put dropship-ids in an array
$text = get_option('dropship-ids');
//explode all separate lines into an array
$textAr = explode("\n", $text);
//trim all lines contained in the array.
$textAr = array_filter($textAr, 'trim');

//Update dropship products from dropship-ids
//Array for the last dropship-ids
$last_ids = [];
//Update function
function update_product_data() {
    foreach($textAr as $value) {
     if (in_array($value, $last_ids)) {

    }
    foreach($last_ids as $value) {
      if (in_array($value, $textAr)) {

      }
    }
  }
}
//**END creating, updating or deleting dropship products



?>

【问题讨论】:

    标签: php wordpress plugins


    【解决方案1】:

    试试这个代码

    我已将$DropshipFields1-&gt;ff_dropship_data_scraper_settings();这一行修改为$DropshipFields1-&gt;ff_dropship_data_scraper_settings;

    add_menu_page代码

    <?php
    /**
     * Plugin Name: Dropship Data Scraper
     * Plugin URI: http://example.com/
     * Description: This plugin scrapes data from websites and puts them in product pages
     * Version: 1.0.0
     * Author: Martijn
     * Author URI: https://example.com/
     * License: Proprietary
     */
    
    //**START Adding custom fields to product options Inventory tab**
    //Display Fields
    add_action( 'woocommerce_product_options_inventory_product_data', 'woo_add_custom_general_fields' );
    
    //Save Fields
    add_action( 'woocommerce_process_product_meta', 'woo_add_custom_general_fields_save' );
    
    function woo_add_custom_general_fields() {
    
      global $woocommerce, $post;
    
      echo '<div class="options_group">';
    
      //Custom fields will be created here...
        //Purchase Price Field
        woocommerce_wp_text_input( 
            array( 
                'id'                => '_purchase_price', 
                'label'             => __( 'Purchase price', 'woocommerce' ), 
                'placeholder'       => '', 
                'desc_tip'                => 'true',
                'description'       => __( 'Enter the purchase price here.', 'woocommerce' ),
                'type'              => 'number', 
                'custom_attributes' => array(
                        'step'  => 'any',
                        'min'   => '0'
                    ) 
            )
        );
    
        //Product Link Field
        woocommerce_wp_text_input( 
            array( 
                'id'          => '_product_link', 
                'label'       => __( 'Product link', 'woocommerce' ), 
                'placeholder' => 'http://',
                'desc_tip'    => 'true',
                'description' => __( 'Enter the product link from the supplier here.', 'woocommerce' ) 
            )
        );
    
      echo '</div>';
    }
    
    function woo_add_custom_general_fields_save( $post_id ){
        //Purchase Price Field
        $woocommerce_purchase_price = $_POST['_purchase_price'];
        if( !empty( $woocommerce_purchase_price ) )
            update_post_meta( $post_id, '_purchase_price', esc_attr( $woocommerce_purchase_price ) );
      elseif( empty( $woocommerce_purchase_price ) )
            update_post_meta( $post_id, '_purchase_price', NULL );
    
        //Product Link Field
        $woocommerce_product_link = $_POST['_product_link'];
        if( !empty( $woocommerce_product_link ) )
            update_post_meta( $post_id, '_product_link', esc_attr( $woocommerce_product_link ) );
      elseif( empty( $woocommerce_product_link ) )
            update_post_meta( $post_id, '_product_link', NULL );
    }
    //**END Adding custom fields to product options Inventory tab**
    
    //**START Plugin Settings Page
    //Settings page dropship ids class
    class DropshipFields {
      public static $counter = 0;
      private $dropshipIds;
    
      //Constructor to count how many DropshipFields objects are created
      function __construct() {
         self::$counter++;
      }
      //function to register settings
      public function ff_dropship_data_scraper_settings() {
        $this->dropshipIds = "dropship-ids" . BaseClass::$counter;
        return register_setting( 'ff-dropship-data-scraper-settings-group', $this->dropshipIds );
      }
      //function to display the dropship fields in ff_dropship_data_scraper_settings_page()
      public function displayFields() {
    
      }
    }
    
    //Eventually I want to put here some code that makes a new object everytime a button is pushed on the settings page
    $DropshipFields1 = new DropshipFields();
    
    //Add menu item on admin side
      add_action('admin_menu', 'ff_dropship_data_scraper_menu');
      function ff_dropship_data_scraper_menu() {
        add_menu_page('FF Dropship Data Scraper Settings', 'FF Dropship Data Scraper Settings', 'administrator', 'ff-dropship-data-scraper-settings', 'ff_dropship_data_scraper_settings_page' , 'dashicons-clipboard');
      }
    
      add_action( 'admin_init', 'ff_dropship_data_scraper_settings' );
      function ff_dropship_data_scraper_settings() {
        $DropshipFields1->ff_dropship_data_scraper_settings;
      }
    
      function ff_dropship_data_scraper_settings_page() { ?>
        <div class="wrap">
        <h1>Dropship data</h1>
    
        <form method="post" action="options.php">
            <?php settings_fields( 'ff-dropship-data-scraper-settings-group' ); ?>
            <?php do_settings_sections( 'ff-dropship-data-scraper-settings-group' ); ?>
            <table class="form-table">
                <tr valign="top">
                <th scope="row">Dropship IDs</th>
                <td><textarea placeholder="Your dropship product ids" name="dropship-ids" rows="5" cols="1000"><?php echo esc_attr( get_option('dropship-ids') ); ?></textarea></td>
                </tr>
            </table>
    
            <table class="form-table">
                <tr valign="top">
                <th scope="row">Dropship IDs</th>
                <td><textarea placeholder="Your dropship product ids" name="dropship-ids" rows="5" cols="1000"><?php echo esc_attr( get_option('dropship-ids') ); ?></textarea></td>
                </tr>
            </table>
    
            <?php submit_button(); ?>
    
        </form>
        </div>
      <?php }
    //**END Plugin Settings Page
    
    //**START cURL Scraper
    foreach($colors as $value) {
      //Variables
      $url = "https://apibeta.banggood.com/getAccessToken?apiTest=1&apiTest=1app_id=&app_secret=";
      $json;
    
      //Initialize
      $ch = curl_init();
    
      //Set options
      //Url to send the request to
      curl_setopt($ch, CURLOPT_URL, $url);
    
      //Return instead of outputting directly
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
      //Include header in the output, set to false
      curl_setopt($ch, CURLOPT_HEADER, 0);
    
      //Execute the request and fetch the response. Check for errors
      $output = curl_exec($ch);
    
      if ($output === FALSE) {
        echo 'cURL ERROR: ' . curl_error($ch);
      }
    
      //Close and free up the cURL handle
      curl_close($ch);
    
      //decode json
      $json = json_decode($output, true);
    }
    
    //**END cURL Scraper
    
    //**START creating, updating or deleting dropship products
    //Put dropship-ids in an array
    $text = get_option('dropship-ids');
    //explode all separate lines into an array
    $textAr = explode("\n", $text);
    //trim all lines contained in the array.
    $textAr = array_filter($textAr, 'trim');
    
    //Update dropship products from dropship-ids
    //Array for the last dropship-ids
    $last_ids = [];
    //Update function
    function update_product_data() {
        foreach($textAr as $value) {
         if (in_array($value, $last_ids)) {
    
        }
        foreach($last_ids as $value) {
          if (in_array($value, $textAr)) {
    
          }
        }
      }
    }
    //**END creating, updating or deleting dropship products
    
    
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多