curl — Shopify — Обновление / удаление метаполя через API метаполя с использованием переполнения стека

Я застрял, пытаясь обновить или удалить метаполе, которое я создал при регистрации пользователя через API клиента shopify.

Сначала я попытался обновить метаполе с помощью пользовательского API, но мне сказали, что метаполе уже существует, и я не могу добавить его снова.

Затем я использовал идентификатор пользователя и позвонил, чтобы получить все мета-поля, связанные с пользователем, используя API-интерфейс мета-поля — это сработало и вернуло все мета-поля для меня.

Однако моя проблема начинается, когда я хочу удалить или обновить метаполе, которое я создал.

Я пробовал много разных вариантов вызовов REST, но, похоже, ничего не работает.

Чтобы попытаться удалить, я использовал:

$baseUrl = "https://".$apikey.":".$password."@".$hostname."/admin/";
......
$curl = curl_init($baseUrl.'metafields/'.$metaID.'.json');
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

// Make the REST call, returning the result
$response = curl_exec($curl);
var_dump($response);

Это ничего не делало, поэтому я попытался углубиться в уровень и использовал следующий URL:

$curl = curl_init($baseUrl.'customers/'.$custID.'/metafields/'.$metaID.'.json');

Этот URL тоже не работал.

Тогда я решил, что я мог бы просто попытаться обновить мета-поле до нового значения, которое оно должно было иметь.

Затем я попытался попробовать следующее, чтобы обновить значение:

$metafield = array('metafields' => array(array(
'id' => $metaID,
'value' => '3',
'value_type' => 'string',
)));

$curl_url = $baseUrl.'customers/'.$custID.'/metafields/'.$metaID.'.json';

$ch = curl_init($curl_url);
$data_string = json_encode(array('metafield'=>$metafield));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
$server_output = curl_exec ($ch);
curl_close ($ch);
var_dump($server_output);

После этого я попробовал альтернативный URL:

$curl_url = $baseUrl.'metafields/'.$metaID.'.json';

Есть идеи, где я все испортил?

2

Решение

Часть 2 работает сейчас — создание и обновление метаполя
Поэтому после написания и тестирования различных наборов кода у меня появилось что-то для работы.

$data = array('metafield' =>
array(
'key' => 'level',
'value' => '1',
'value_type' => 'string',
'namespace' => 'Wholesaler'
)
);
$curl_url = $baseUrl.'customers/'.$custID.'/metafields.json';
//$ch = curl_init($baseUrl.$sid.'.json'); //set the url

$session = curl_init($curl_url);

curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($session, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: POST') );
curl_setopt($session, CURLOPT_POSTFIELDS, json_encode($data));

curl_setopt($session, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($session, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

if(ereg("^(https)",$curl_url)) curl_setopt($session,CURLOPT_SSL_VERIFYPEER,false);

$response = curl_exec($session);
curl_close($session);

$json = json_decode( $response, true );

var_dump($json);
echo "<br>-------------------------------------------------<br>";
echo $curl_url;

Этот код позволил мне создать мета-поле для пользователя, у которого его нет, а также обновить его, если поле ключа и пространство имен делают его уникальным, оно создаст новое поле, если вы используете ключ и пространство имен, которое уже существует это обновит значение.

Я надеюсь, что это помогает кому-то еще там.

2

Другие решения

Я делаю этот звонок, и он работает идеально каждый раз:

DELETE /admin/customers/123456789/metafields/987654321.json

Где мой идентификатор клиента 123456789 и метаполе, которое я хочу убить, имеет идентификатор 987654321

1

Часть первая сделана — Удалить

После многих исследований и проб разных сценариев у меня сработало следующее:

$curl_url = $baseUrl.'customers/'.$custID.'/metafields/'.$metaID.'.json';
//$curl_url = $baseUrl.'metafields/'.$metaID.'.json';

$session = curl_init($curl_url);

curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

curl_setopt($session, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($session, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

if(ereg("^(https)",$curl_url)) curl_setopt($session,CURLOPT_SSL_VERIFYPEER,false);

$response = curl_exec($session);
curl_close($session);

$json = json_decode( $response, true );

var_dump($json);

Теперь я могу удалить метаполе.

0
По вопросам рекламы [email protected]