我想通过抓取或使用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
?>
答案 0 :(得分:0)
试试此代码
我已将此行$DropshipFields1->ff_dropship_data_scraper_settings();
修改为$DropshipFields1->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
?>