Как получить желаемый результат из декодированного многомерного массива json - PHP в WordPress? - PullRequest
1 голос
/ 19 сентября 2019

Я уже несколько дней бьюсь головой и надеюсь, что кто-то гораздо умнее меня (что не сложно, так как я новичок) сможет пролить свет на мою проблему.У меня есть данные json, поступающие из разных API, первый API дает мне список продуктов и маршрут к каждому отдельному API продуктов, который я затем использую для получения данных и их декодирования в многомерный массив PHP в WordPress.Мне нужно извлечь значения в определенном порядке и добавить форматирование HTML, а затем вернуть их в строку.

Это упрощенное представление моих фидов json, которые были декодированы в массив, во-первых, это json, который я извлекаю адрес API из:

{
  "data": [
    {
      "product": "Product A",
      "api": "some/api/feeda",
      "catagory": "some catagory"
    },
    {
      "product": "Product B",
      "api": "some/api/feedb",
      "catagory": "other catagory"
    }
  ]
}

Второй, затемизвлекает и возвращает продукт json:

{
  "data": {
    "title": "Product A",
    "catagory": "Catagory 1",
    "specifications": [
      {
        "detail": "Technical detail 1",
        "notes": "",
        "subDetails": [
          {
            "width": "A not so wide version",
            "height": "This one is shorter"
          },
          {
            "width": "a wider version",
            "height": "a taller version"
          }
        ]
      },
      {
        "detail": "Technical detail 2",
        "notes": "a little bit about detail 2 that is different"
      },
      {
        "detail": "Technical detail 3",
        "notes": "something boring to do with detail 3"
      }
    ]
  }
}

Моя цель - создать сообщение только из выбранной категории и заполнить его заголовком и содержимым в формате html, извлеченным из «спецификаций» (notes и subDetails), поэтомучто содержимое поста выглядит примерно так:

<b>Technical detail 1</b>
A not so wide version
a wider version<br>
<b>Technical detail 2</b>
a little bit about detail 2 that is different<br>
<b>Technical detail 3</b>
something boring to do with detail 3<br>

Прежде чем я начну создавать целую кучу постов, я не хочу использовать 'wp_insert_post', я использую 'echo', чтобы я мог видетькакие результаты я получаю.Я дошел до PHP и сумел создать список с каждым названием продукта, но я больше ничего не пробовал (мне удалось получить спецификации продуктов в списке, но они были неправильными!)

    function product_list($productlist$) {
            $url_request = wp_remote_get('https://main/api/products/v1/all');
            if (is_wp_error($url_request)) {
                return false; // Bail early
            }
            $body = wp_remote_retrieve_body($url_request);
            $url_json = json_decode($body, true);
            $url_data = $url_json['data'];
            if (!empty($url_data)) {
                foreach($product_url as $product) {
                    $singleproduct_url = $product["url"];
                    $singleproduct_urlrequest = wp_remote_get('https://main/api/products/v1'.$single_product_url.
                        '');
                    $singleproduct_body = wp_remote_retrieve_body($singleproduct_urlrequest);
                    $singleproduct_json = json_decode($singleproduct_body, true);
                    $singleproduct_data = $singleproduct_json['data'];
                    $productspecs = $singleproduct_data['specifications'];
                    foreach($productspecs as $productspec) {
                        $specdetail = "<br>".$productspec["detail"];
                        $subdetails = $productspec['subDetails']
                        if (!empty($productspec['note'])) {
                            $productnote = $productspec['note'];
                        } else {
                            foreach($subdetails as $subdetail) {
                                $subdetailtext = $subdetails[width];
                            }
                        };

                        echo '<li>';
                        echo $singleproduct_data["title"];
                        echo $productnote;
                        echo '</li>';
                    }
                    echo '</ul>';
                }
            }

Любая помощь будет принята с благодарностью !!!

1 Ответ

0 голосов
/ 19 сентября 2019

Итак, я попытался решить вашу проблему и придумал эту функцию, я использовал ваш продукт json.пожалуйста, попробуйте и дайте мне знать, если это работает для вас.

$api_json = '{
  "data": [
    {
      "product": "Product A",
      "api": "some/api/feeda",
      "catagory": "some catagory"
    },
    {
      "product": "Product B",
      "api": "some/api/feedb",
      "catagory": "other catagory"
    }
  ]
}';

$product_json = '{
  "data": {
    "title": "Product A",
    "catagory": "Catagory 1",
    "specifications": [
      {
        "detail": "Technical detail 1",
        "notes": "",
        "subDetails": [
          {
            "width": "A not so wide version",
            "height": "This one is shorter"
          },
          {
            "width": "a wider version",
            "height": "a taller version"
          }
        ]
      },
      {
        "detail": "Technical detail 2",
        "notes": "a little bit about detail 2 that is different"
      },
      {
        "detail": "Technical detail 3",
        "notes": "something boring to do with detail 3"
      }
    ]
  }
}';

function generate_posts($product_json, $category){

    $product_arr = json_decode($product_json, true);

    if($product_arr['data']['catagory'] == $category){
        $result = '';
        foreach($product_arr['data']['specifications'] as $spec){
            $result .= "<b>{$spec['detail']}</b> \r\n";
            $result .= (!empty($spec['notes']) ? "{$spec['notes']}<br>\r\n" : "");
            if(!empty($spec['subDetails'])){
                foreach($spec['subDetails'] as $k=>$sub){
                    if($k == (count($spec['subDetails']) -1)){
                        $result .= "{$sub['width']}";
                    }else{
                        $result .= "{$sub['width']} \r\n";
                    }
                }
                $result .= "<br> \r\n";
            }
        }
        return $result;
    }
    return false;
}

echo generate_posts($product_json, 'Catagory 1');

Вывод:

<b>Technical detail 1</b> 
A not so wide version 
a wider version<br> 
<b>Technical detail 2</b> 
a little bit about detail 2 that is different<br>
<b>Technical detail 3</b> 
something boring to do with detail 3<br>

Вы можете вызвать эту функцию в своем коде после этой строки

$singleproduct_body = wp_remote_retrieve_body($singleproduct_urlrequest);
$myProduct = generate_posts($singleproduct_body, $category); //use desired variables 

Если вам нужна дополнительная помощь, дайте мне знать.

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