Как инициализировать метод POST и PUT из пользовательской конечной точки Wordpress - PullRequest
0 голосов
/ 04 октября 2019

Я создаю пользовательскую конечную точку в WordPress, которая должна делать следующее: 1. Создать путь (готово) 2. Вызвать функцию, которая: 2.1. Получает все продукты от WooCommerce и сохраняет их в массиве (готово) 2.2. Сравнивает продукты на WooCommerce с продуктами из внешней базы данных и, если есть какая-либо разница в данных, обновляется (PUT) данными из внешней БД 2.3. Если некоторые продукты существуют во внешней БД, но не существуют в WooCommerce, создайте их в WooCommerce (POST)

Мне удалось получить все данные из WooCommerce через wc_get_products ($ args), но я не могу найти, как это сделать. написать PUT и метод POST для обновления или создания продуктов. Если я использую Automatic / WooCommerce для отправки или размещения продуктов из отдельного файла (не из настраиваемой конечной точки), это работает, но если я сохраняю Automatic / WooCommerce в настраиваемой конечной точке, это говорит мне следующее:

Failed to connect to localhost port 8000: Connection refused in /var/www/html/wp-content/plugins/wl-api/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClient.php on line 417 

это имеет смысл, потому что с пользовательской конечной точки я уже подключен к WooCommerce, и Automatic / WooCommerce попытается подключиться снова. Так есть ли какие-либо методы, такие как wc_get_products, но для PUT и PUSH?

//CUSTOM ENDPOINT PHP FILE
add_action('rest_api_init', 'customEndpoint');

function customEndpoint() {
    register_rest_route('endpoint', '/transfer', array(
        'methods' => 'GET',
        'callback' => 'get_data',
    ));
}
function get_data() {
    include "updateOrCreate.php";
}

//updateOrCreate.php
require 'vendor/autoload.php';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

require 'vendor/guzzlehttp/guzzle/src/Client.php';
use Automattic\WooCommerce;
//-----------Connect to the External DB----------
$baseUrl=...;
$externalClient = new GuzzleHttp\Client();
$res = $externalClient->request('GET', $baseUrl, [
    "query" => ['fields' => $fields, 'aktiv' => true],
    'auth' => ['...', '...']
]);
$articles = json_decode($res->getBody());

//-----------Connect to WooCommerce DB
$wooKey= "...";
$wooSecret= "...";
$wooCommerceBaseUrl = "http://localhost:8000";
$wooCommerceClient = new WooCommerce\Client($wooCommerceBaseUrl,
$wooKey, $wooSecret,
[
    'wp_api' => true,
    'version' => 'wc/v3',
]
);
//GET all products from WooCommerce
$args = array(
'status' => 'publish',
'limit' => -1,
);  
$wooExistingProducts = wc_get_products($args);



$productsForWoo= [];

//check if there are no products on woocommerce:
if(empty($wooExistingProducts)){
foreach ($articles as &$article){
//Create the necessary template to initialize the connections between external products and woocommerce product template
    $wooTemplate = [
...
    ];
    array_push($productsForWoo, $wooTemplate);
//CREATE BATCHES OF 10
    if(sizeof($productsForWoo) == 10){
        $data = [
            'create' => $productsForWoo,
        ];
        $wooCommerceClient->post('products/batch', $data);
        $productsForWoo = [];
    }
}
//As there is a big chance that the last batch will have less than 10 products, push them as well to wooCommerce as a last batch
    $data = [
        'create' => $productsForWoo,
    ];
    $wooCommerceClient->post('products/batch', $data);
}
// if there are existing products on woocommerce
else{
//Loop through all existing products on the external DB
    foreach ($articles as &$article){ 
            $did_match = false;
            $wooTemplate = [
                ...
            ];
//loop through all products on WooCommerce
            foreach ($wooExistingProducts as &$product){
//if the product id from the external db matches the id from an existing product on woocommerce
                if(...){
//update that product
            $wooCommerceClient->put('products/'.urlencode($product->id), $wooTemplate);
            $did_match = true;
            break;
        }
    }
//otherwise, if the product from the external db is not found on the woocommerce database, create it
    if(!$did_match){
    array_push($productsForWoo, $wooTemplate);
    if(sizeof($productsForWoo) == 10){
        $data = [
            'create' => $productsForWoo,
        ];
        $wooCommerceClient->post('products/batch', $data);
        $productsForWoo = [];
    }
}
}
//As there is a big chance that the last batch will have less than 10 products, push them as well to wooCommerce as a last batch
            $data = [
            'create' => $productsForWoo,
            ];
            $wooCommerceClient->post('products/batch', $data);
}

Я буду очень признателен за любой вклад, связанный с моей проблемой. Спасибо!

1 Ответ

0 голосов
/ 04 октября 2019

Чтобы получить POST и PUT, вам нужно реализовать методы (глаголы).

Вы можете использовать:

$verb = $_SERVER['REQUEST_METHOD'];
echo $verb;

..., чтобы проверить, какой метод HTTP-запроса (PUT vs GET) вы используете.

Вот статья SO о методах PHP , которую я отмечал и часто использую при устранении неполадок. Приведенный здесь код довольно чистый и отличное место для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...