Search code examples
magentoproductmagento-soap-api

Magento API - Get Product Names from specific Category


I'm working on the Magento API and I got some questions... I try to get all Product Names from a specific category at Magento.

here's my code for that:

<?php
        $host = "www.host.tld/index.php";
        $client = new SoapClient("http://".$host."/api/soap/?wsdl"); 
        $apiuser= "user"; //webservice user login
        $apikey = "pass"; //webservice user pass
        try { 
            // Login
            $sess_id= $client->login($apiuser, $apikey);

        // Getting all products from category
            $filters = array( 'category_ids' => array('107') );
            $productList = $client->call($sess_id, 'catalog_category.assignedProducts', $filters);  
            //iterate and get all the product_id's and put it into one array
            foreach($productList as $products => $values){ 
                    if (isset($values['product_id']) || array_key_exists('product_id', $values)) {
                        $product_ids[] = $values['sku'];
                    }
            }
            //Get product details from product_id
            foreach($product_ids as $key => $values) {
                $details = $client->call( $sess_id, 'product.info', array($values));
                #echo $details['name'];
            } 
        }
        catch (Exception $e) { //while an error has occured
            echo "==> Error: ".$e->getMessage();
               exit();
        }
?>

The main problem I have is, that the performance I get is not the best. For each "product name" I make one api-call for getting all products. Every time for each product. That's probably not so clever.

What can I optimize. Am I missing something?

I can imagine, that if I want to get the details from more than one category, my server will crash ;). We have about 1000 products in our shop.

Thanks for the help.


Solution

  • You can use to catalog_category.assignedProducts

    Retrieve the list of products assigned to a required category.

    try this if you are using SOAP V1:

    $client = new SoapClient('http://magentohost/api/soap/?wsdl');
    
    // If somestuff requires api authentification,
    // then get a session token
    $session = $client->login('apiUser', 'apiKey');
    
    $result = $client->call($session, 'catalog_category.assignedProducts', '4');
    var_dump($result);
    
    // If you don't need the session anymore
    //$client->endSession($session);
    

    if you are using SOAP V2:

    $proxy = new SoapClient('http://magentohost/api/v2_soap/?wsdl'); // TODO : change url
    $sessionId = $proxy->login('apiUser', 'apiKey'); // TODO : change login and pwd if necessary
    
    $result = $proxy->catalogCategoryAssignedProducts($sessionId, '4');
    var_dump($result);
    

    and the respond would be like this:

    array
      0 =>
        array
          'product_id' => string '1' (length=1)
          'type' => string 'simple' (length=6)
          'set' => string '4' (length=1)
          'sku' => string 'n2610' (length=5)
          'position' => string '1' (length=1)
      1 =>
        array
          'product_id' => string '2' (length=1)
          'type' => string 'simple' (length=6)
          'set' => string '4' (length=1)
          'sku' => string 'b8100' (length=5)
          'position' => string '1' (length=1)