Jump to content

Billy-3k

Members
  • Posts

    11
  • Joined

  • Last visited

Billy-3k's Achievements

Member

Member (2/5)

0

Reputation

  1. After trying to find for a solution i found out that $resultB = $xmlB->xpath("//PRODUCT//PRINT_POSITION_URL[@color=substring-after('{$tnum}','-')]/text()"); isn't working. If i replace [@color=substring-after('{$tnum}','-')] with the product number for example [@color=substring-after('MO7375-06','-')] outputs the right result. Any thoughts?
  2. I can't get the right results with the following. $xmlB->xpath("//PRODUCT//PRINT_POSITION_URL[@color=substring-after('{$tnum}','-')]/text()"); I tried this in my first foreach with no luck. $resultA = $xmlA->xpath("//PRODUCTS//PRODUCT"); $num = $xmlA->xpath("//PRODUCT//PRODUCT_NUMBER/."); $tnum = implode($num); $resultB = $xmlB->xpath("//PRODUCT//PRINT_POSITION_URL[@color=substring-after('{$tnum}','-')]/text()"); foreach ($resultB as $prtpos ) { $prodnew->addChild('PRINT_POSITION_URL', $prtpos); }
  3. I'm trying to get the url of PRINT_POSITION_URL based on PRODUCT_NUMBER. For product with product number 7375-06 i want to get PRINT_POSITION_URL color="06", for product with product number 7375-04 i want to get PRINT_POSITION_URL color="04" etc. These two values are in different XML files which i am getting them from url and they are related with a field PRODUCT_PRINT_ID. Here is my first XML file(products.xml): <PRODUCTS> <PRODUCT> <PRODUCT_NUMBER>7375-06</PRODUCT_NUMBER> <PRODUCT_NAME>Soft ball</PRODUCT_NAME> <PRODUCT_PRINT_ID>40002010</PRODUCT_PRINT_ID> </PRODUCT> </PRODUCTS> And here is my second XML file(print-info.xml): <PRINTINGINFORMATION> <PRODUCTS> <PRODUCT> <PRODUCT_PRINT_ID>40002010</PRODUCT_PRINT_ID> <PRINTING_POSITIONS> <PRINTING_POSITION> <PRINT_POSITION_URL color="04">https://thumb_7375_04.jpg</PRINT_POSITION_URL> <PRINT_POSITION_URL color="05">https://thumb_7375_05.jpg</PRINT_POSITION_URL> <PRINT_POSITION_URL color="06">https://thumb_7375_06.jpg</PRINT_POSITION_URL> </PRINTING_POSITION> </PRINTING_POSITIONS> </PRODUCT> </PRODUCTS> </PRINTINGINFORMATION> Here is what I've tried based on @Barand answer in another topic and i want to thank him for his help. <?php header ("Content-Type:text/xml"); $xmlA = simplexml_load_file('ftp://.../prodinfo_EN.xml'); $xmlB = simplexml_load_file('ftp://.../printinfo.xml'); // create empty output xml object $final = new simpleXMLElement('<?xml version="1.0" encoding="utf-8"?><PRODUCTINFORMATION></PRODUCTINFORMATION>'); $products = $final->addChild("PRODUCTS"); foreach ($xmlA->PRODUCTS->PRODUCT as $proda) { $prodbaseno = (string)$proda->PRODUCT_NUMBER; $prodname = (string)$proda->PRODUCT_NAME; $prodprintid = (string)$proda->PRODUCT_PRINT_ID; // build the output xml $prodnew = $products->addChild('PRODUCT'); $prodnew->addChild('PRODUCT_NUMBER', $prodbaseno); $prodnew->addChild('PRODUCT_NAME', $prodname); $prodnew->addChild('PRODUCT_PRINT_ID', $prodprintid); // find related field from xml file B based on PRODUCT_PRINT_ID if ($prodarr = $xmlB->xpath("PRODUCTS/PRODUCT[PRODUCT_PRINT_ID='$prodprintid']")) { $prodb = $prodarr[0]; $prtposns = $prodnew->addChild('PRINTING_POSITIONS'); foreach ($prodb->PRINTING_POSITIONS->PRINTING_POSITION as $prtpos ) { $posnew = $prtposns->addChild('PRINTING_POSITION'); $posnew->addChild('PRINT_POSITION_URL', $prtpos->PRINT_POSITION_URL); } } } echo $final->saveXml(); ?> And here is the output: <PRODUCTINFORMATION> <PRODUCTS> <PRODUCT> <PRODUCT_NUMBER>MO7375-06</PRODUCT_NUMBER> <PRODUCT_NAME>Soft ball</PRODUCT_NAME> <PRODUCT_PRINT_ID>40002010</PRODUCT_PRINT_ID> <PRINTING_POSITIONS> <PRINTING_POSITION> <PRINT_POSITION_URL color="04">https://thumb_7375_04.jpg</PRINT_POSITION_URL> </PRINTING_POSITION> </PRINTING_POSITIONS> </PRODUCT> </PRODUCTS> </PRODUCTINFORMATION> As you can see I'm getting the PRINT_POSITION_URL for color="04" but i want PRINT_POSITION_URL for color="06" based on PRODUCT_NUMBER. I should probably use xpath with substring-after method but i can't get it work. Any help would be greatly appreciated.
  4. Ok so i've found the solution by using a function, in case anyone in the future needs it. This fuction hides same title products in shop page, in category and in search results. add_filter( 'posts_groupby', 'custom_posts_groupby', 10, 2 ); function custom_posts_groupby( $groupby, $query ) { global $wpdb; if ( is_main_query() && (is_shop() || is_product_category() || is_search() )) { $groupby = "{$wpdb->posts}.post_title"; } return $groupby; }
  5. Yeap, i'm using variations but it's more complex than that, there's a reason i can't use variation for this problem. I must find a way to exclude same name products(or same fields) value from the shop page.
  6. I'm not sure what you mean with $list['Plesk'] = [ product data ]. You think it will help with the pagination issue?
  7. Hello, I need to hide products with same title from WooCommerce shop page and i'm trying to achieve that with a custom loop. For example i have 5 products called "Plex" and the only diferrence between them is the SKU field and the color. I don't care which of the same product will be displayed in the shop page, i just want to display only one of all these products. I created a loop which is working and does hide products with same name but i have a problem. If i set posts_per_page=8 it shows less because it counts the hidden products also. $args = array( 'post_type' => 'product', 'posts_per_page' => 8 ); $query = new WP_Query($args); $list = array(); while ($query->have_posts()) : $query->the_post(); if(in_array(get_the_title(), $list)){ continue; } $list[] = get_the_title(); ?> <li><?php wc_get_template_part( 'content', 'product' ); ?></li> <?php endwhile; wp_reset_postdata(); P.S. I don't want to remove these products, i just want to hide them from shop loop! Any ideas what is the problem with the loop? Is there a better way to achieve that?
  8. Thank you very much for your help! I agree it's more sensible and a lot easier but i need this very particular structure that I wrote because it's the only way to import successfully the data using a plugin in Wordpress...
  9. I'm new to this and I never tried to change structure of XML files, that's why it sounds hard. I'm still trying to understand how this works! Thanks for your help, I'll try to import nodes one by one as you said and I'll get back!
  10. Thank you for your reply! I guess i must use cloneNode to clone COLOR_CODE and insertBefore to place it where i want, right? Or is there an easier way to achieve that? It sounds a lot of work and kinda hard for me and i'm wondering if it's better to start over with XSLT.
  11. Hello, I've created a PHP file to merge XML files by ReferenceID(product_print_id) but i don't get the result that i want. I think i must use cloneNode and DOMNode::insertBefore but I think i'm lost. The first file is prodInfo.xml: <?xml version="1.0" encoding="utf-8"?> <PRODUCTINFORMATION> <PRODUCTS> <PRODUCT> <PRODUCT_NUMBER>53-03</PRODUCT_NUMBER> <PRODUCT_PRINT_ID>42</PRODUCT_PRINT_ID> <PRODUCT_NAME>ProductFirst</PRODUCT_NAME> <COLOR_CODE>03</COLOR_CODE> </PRODUCT> </PRODUCTS> </PRODUCTINFORMATION> and the second file is printInfo.xml: <?xml version="1.0" encoding="utf-8"?> <PRINTINGINFORMATION> <PRODUCTS> <PRODUCT> <PRODUCT_PRINT_ID>42</PRODUCT_PRINT_ID> <PRINTING_POSITIONS> <PRINTING_POSITION> <ID>TOP BOX</ID> <PRINTING_TECHNIQUE> <ID>DL</ID> </PRINTING_TECHNIQUE> <PRINTING_TECHNIQUE> <ID>L2</ID> </PRINTING_TECHNIQUE> <PRINTING_TECHNIQUE> <ID>P4</ID> </PRINTING_TECHNIQUE> </PRINTING_POSITION> </PRINTING_POSITIONS> </PRODUCT> </PRODUCTS> </PRINTINGINFORMATION> The php file i created is the following: <?php header ("Content-Type:text/xml"); $target = new DOMDocument(); $target->preserveWhiteSpace = FALSE; $target->load('prodInfo.xml'); $targetXpath = new DOMXpath($target); $source = new DOMDocument(); $source->load('printInfo.xml'); $sourceXpath = new DOMXpath($source); foreach ($targetXpath->evaluate('//PRODUCT') as $PRODUCTNode) { $PRODUCT_PRINT_ID = $targetXpath->evaluate('string(PRODUCT_PRINT_ID)', $PRODUCTNode); foreach ($sourceXpath->evaluate('//PRODUCT[PRODUCT_PRINT_ID="'.$PRODUCT_PRINT_ID.'"]/*[not(self::PRODUCT_PRINT_ID)]') as $node) { $PRODUCTNode->appendChild( $target->importNode($node, TRUE) ); } } $target->formatOutput = TRUE; echo $target->saveXml(); ?> The output/result i get is this: <?xml version="1.0" encoding="utf-8"?> <PRODUCTINFORMATION> <PRODUCTS> <PRODUCT> <PRODUCT_NUMBER>53-03</PRODUCT_NUMBER> <PRODUCT_PRINT_ID>42</PRODUCT_PRINT_ID> <PRODUCT_NAME>ProductFirst</PRODUCT_NAME> <COLOR_CODE>03</COLOR_CODE> <PRINTING_POSITIONS> <PRINTING_POSITION> <ID>TOP BOX</ID> <PRINTING_TECHNIQUE> <ID>DL</ID> </PRINTING_TECHNIQUE> <PRINTING_TECHNIQUE> <ID>L2</ID> </PRINTING_TECHNIQUE> <PRINTING_TECHNIQUE> <ID>P4</ID> </PRINTING_TECHNIQUE> </PRINTING_POSITION> </PRINTING_POSITIONS> </PRODUCT> </PRODUCTS> </PRODUCTINFORMATION> But what i want to achieve is this: <?xml version="1.0" encoding="utf-8"?> <PRODUCTINFORMATION> <PRODUCTS> <PRODUCT> <PRODUCT_NUMBER>53-03</PRODUCT_NUMBER> <PRODUCT_PRINT_ID>42</PRODUCT_PRINT_ID> <PRODUCT_NAME>ProductFirst</PRODUCT_NAME> <PRINTING_POSITIONS> <PRINTING_POSITION> <ID>TOP BOX</ID> <PRINTING_TECHNIQUE> <ID>DL</ID> </PRINTING_TECHNIQUE> <COLOR_CODE>03</COLOR_CODE> </PRINTING_POSITION> <PRINTING_POSITION> <ID>TOP BOX</ID> <PRINTING_TECHNIQUE> <ID>L2</ID> </PRINTING_TECHNIQUE> <COLOR_CODE>03</COLOR_CODE> </PRINTING_POSITION> <PRINTING_POSITION> <ID>TOP BOX</ID> <PRINTING_TECHNIQUE> <ID>P4</ID> </PRINTING_TECHNIQUE> <COLOR_CODE>03</COLOR_CODE> </PRINTING_POSITION> </PRINTING_POSITIONS> </PRODUCT> </PRODUCTS> </PRODUCTINFORMATION> So as you can see i want to repeat the field PRINTING POSITION ID for every PRINTING TECHNIQUE and also i want to repeat the field COLOR CODE for every PRINTING POSITION. Anyone can help me with this? Thanks in advance.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.