代码之家  ›  专栏  ›  技术社区  ›  SimmiS

使用shopify的API和PHP获取shopify商店上的所有产品,然后返回“list products.PHP”页面

  •  3
  • SimmiS  · 技术社区  · 6 年前

    我最近开始发展,如果可能的话,我希望得到一些帮助,重新审视我面临的以下问题。首先,我的目标[项目范围]是做以下工作:

     1. Connect to the shopify API via an external web app [Done this Successfully]
     2. Fetch a list of all products in that specific store [Struggling with this]
     3. Insert (or update there after) in to a MySQL database [Can do this successfully]
    

    目前,我可以按照shopify的API限制,每次调用250个产品,并对此进行回应。我做了一些研究,发现我需要根据商店中的产品总数(5000种产品/每页250种产品=20页)对请求进行分页。从这一点上,我可以循环浏览每一页,并呼应出所有的产品。然而,当我运行这个循环时,我得到了前250个产品在商店中的总数量的反复回应(如果措辞有点模糊,我深表歉意,因为我对API和PHP都是全新的)。

    我的问题是:如何循环并回显所有产品和所有页面,并回显到我创建的“list products.php”页面?

    我当前的代码如下:

    获取产品。php//连接到shopify api。

    <?php
    session_start();
    $username = $_SESSION['username'];
    if(empty($_SESSION['username']))
    {
        header("Location: loginpage.php");
        die("Redirecting to login.php");
    }
    $api_url = 'https://apikey:password@store.myshopify.com';
    $products_obj_url = $api_url . '/admin/products.json?limit=250&page='.($i+1);
    $products_content = @file_get_contents( $products_obj_url );
    $products_json = json_decode( $products_content, true );
    $products = $products_json['products'];
    ?>
    

    获取产品计数。php//统计商店中当前列出的产品数量。

    <?php
     session_start();
     $username = $_SESSION['username'];
    if(empty($_SESSION['username']))
    {
        header("Location: loginpage.php");
        die("Redirecting to login.php");
    }
     $api_url = 'https://apikey:password@store.myshopify.com';
     $count_obj_url = $api_url . '/admin/products/count.json';
     $count_content = @file_get_contents( $count_obj_url );
     $count_json = json_decode( $count_content, true );
     $count = $count_json['count'];
    ?>
    

    列出产品。php//显示商店中所有产品的列表

    <!DOCTYPE html>
    
     <?php
      include('../get-products.php'); 
      include('../get-product-count.php'); 
    ?>
    
    <html>
    <head>
      <title>List Products</title>
      <link rel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.40/css/uikit.min.css" />
      <script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.40/js/uikit.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.40/js/uikit-icons.min.js"></script>
    </head>
    
    <body>
     <?php include('../header.php'); ?>
    
      <div class="uk-alert-success uk-margin-medium-left uk-margin-medium-right" uk-alert>
      <a class="uk-alert-close" uk-close></a>
    
      <p>All products.</p>
      <table class="uk-table uk-table-small uk-table-striped uk-table-divider uk-margin-small uk-margin-small-left uk-text-small" uk-grid="">
    
    <tr>
        <td>Product ID</td>
        <td>Product Title</td>
        <td>Product SKU</td>
        <td>Variant Title</td>
        <td>Price</td>
        <td>Inventory</td>
    </tr>
    <?php
    
    // Loop through each page and pull all products. Reason being, Shopify API call limit is 250 calls at once.
    // This currently display the first 250 products on the first page for the full product count.
    
    $i = 0;
    $pages = ceil($count/250); // Count products / 250 from get-products.php = to amount of pages rounded up.
    
        for($i = 0; $i < $pages; $i++){
            foreach($products as $product){   
                echo "<tr>
                <td>". $product['variants'][0]['product_id'] . "</td>
                <td>". $product['title']. "</td>
                <td>". $product['variants'][0]['title'] . "</td>
                <td>". $product['variants'][0]['sku'] . "</td>
                <td>". $product['variants'][0]['price'] . "</td>
                <td>". $product['variants'][0]['old_inventory_quantity'] . "</td>
                </tr>";
            } 
        }
    ?>   
    </table>
    
    <?php include('../footer.php'); ?>
    
    </body>
    </html>
    

    最后:在此方面的任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  3
  •   MonkeyZeus    6 年前

    你非常接近。

    您需要继续获取循环中接下来的250个产品:

    for($i = 0; $i < $pages; $i++){
    
        // not sure if this exact example will work 100% for you but you need to re-execute the code from this file on every iteration
        // By placing this here, get-products.php will become aware of the incrementing $i and fetch the next page of products
        require( '../get-products.php' );
    
        foreach($products as $product){   
            echo "<tr>
            <td>". $product['variants'][0]['product_id'] . "</td>
            <td>". $product['title']. "</td>
            <td>". $product['variants'][0]['title'] . "</td>
            <td>". $product['variants'][0]['sku'] . "</td>
            <td>". $product['variants'][0]['price'] . "</td>
            <td>". $product['variants'][0]['old_inventory_quantity'] . "</td>
            </tr>";
        } 
    }