Thanks Chad!! Will see what customer wants to do.
Printable View
Situation:
I am staging products/categories one site and will later move them to the live site. I am not bothering to create my CEON URIs on the staging site, will do that on the live site. The reason I'm not triggering CEON URIs is that Zen though the product ID will not change between staging and live, the categories may change. Since the category will appear in the URI, I must wait.
Question:
Is there a way to create an href from one internal product product page to another that will trigger the CEON URI? Given that I know the Product ID will not change, it *seems* like I should be able to just use the Zen cpath.
Testing:
To test it out, I created an href from one product to another before triggering a CEON URI for the second page. Then I triggered a URI for the second page. Sadly I can't seem to get it to work!
Here is the test page:
http://0stage.justmedical***DOT***bi..._Test_1_Images
On that page, you will see a reference to Clark Socket. If you hover over it, you will see a Zen created url. But if you click on the link, you will transport to a CEON URI.
Here is the actual code I used:
<p>Here is a link: <strong><a href="/index.php?main_page=product_info&cPath=4&products_id=124">Clark Socket</a></strong></p>
Is there a way to trigger the URI (cause it to print into the html) of the originating page, without actually knowing what the URI will be?
URIs from this plugin are generated/substituted when using the zen_href_link function, not by parsing page hard entered code. To perform some sort of similar substitution would require code to parse the description. And make that substitution. Alternatively, the description can be later modified through whatever "tool" is desired. Ie. Phpmyadmin, a sql query to replace, a mass update type program.
In the end though this is proof that with or without the uri being known. To be rewritten that CEON URI mapping works with original ZC URIs as well...
Further alternatively, this is a reason that if generating URIs that the development site be setup to support the live site as a mirror to the live site making movement of that data seamless.
I was afraid that would be the answer: "URIs from this plugin are generated/substituted when using the zen_href_link function, not by parsing page hard entered code."
Bummer. I'll find another way...
Thanks MC!
I hacked this together a few years back to auto generate CEON product URIs - it's crude but it's worked well for me, and it's free. Simply copy one of the admin pages and drop the code in, run as needed to update product URIs.
It lists all the categories on the site. Click the category name to auto populate the product URIs into the database.
Notes:
- It uses the old mysql function because I haven't kept up to date on coding practices
- Filebase it works with for me is CEON 4.4.1
- The site I have it on is running ZC 1.5.1
- You do need the category slug to be generated before generating the product URIs - just navigate to the regular zencart "edit categories" page and edit then save each category
Code:<?php // display categories to select from
$categories = mysql_query("SELECT * FROM zen_categories LEFT JOIN zen_categories_description ON zen_categories.categories_id = zen_categories_description.categories_id WHERE zen_categories.categories_status='1'");
echo "<p>Click on a category to update it's products: <br/>";
while ($showthiscat = mysql_fetch_assoc($categories)){
echo "<a href='update-ceon-uri.php?updatecategory={$showthiscat['categories_id']}'>{$showthiscat['categories_name']}</a>, \n";
}
echo "</p>\n<hr/>\n";
?>
<?php
$replacechars = array("(",")","'","\"","$","%","&"); // specify all characters to be eliminated
// update all products in category
$updateuris = mysql_query("SELECT * FROM zen_products WHERE master_categories_id='{$_GET['updatecategory']}'");
while ($thisuri = mysql_fetch_assoc($updateuris)) {
unset($catname);
$productsid = $thisuri['products_id'];
$productsname = implode(mysql_fetch_assoc(mysql_query("SELECT products_name FROM zen_products_description WHERE products_id='{$productsid}'")));
$catname = implode(mysql_fetch_assoc(mysql_query("SELECT uri FROM zen_ceon_uri_mappings WHERE main_page='index' AND associated_db_id='{$thisuri['master_categories_id']}'")));
$newuri = $catname."/".strtolower(str_replace(" ","-",$productsname));
//$newuri = "/".strtolower(str_replace(" ","-",$productsname)); // product-only on this site
$newuri = str_replace($replacechars,"",$newuri); // remove characters in the array above
$today = date('Y-m-d G:i:s'); // today
if($productsname == ''){continue;} // skip empty names
$exists = implode(mysql_fetch_assoc(mysql_query("SELECT * FROM zen_ceon_uri_mappings WHERE main_page='product_info' AND associated_db_id='$productsid'"))); // used to check if product already exists to do update vs insert
if ($exists) { // if already in zen_ceon_uri_mappings, update
mysql_query("UPDATE zen_ceon_uri_mappings SET uri='$newuri' WHERE main_page='product_info' AND associated_db_id='$productsid'");
$result = "Updated... ".mysql_error();
} else { // else, insert
mysql_query("INSERT IGNORE INTO zen_ceon_uri_mappings
(`uri`, `language_id`, `current_uri`, `main_page`, `query_string_parameters`, `associated_db_id`, `alternate_uri`, `redirection_type_code`, `date_added`) VALUES
('$newuri','1','1','product_info',NULL,'$productsid',NULL,NULL,'$today')");
$result = "Inserted... ".mysql_error();
}
echo "<p>$newuri (cat: {$thisuri['master_categories_id']}) - $result</p>\n"; // display whether updated or inserted and any problems encountered
}
?>
@bobthemolder,
I think the following does the same thing, but uses the Zen Cart $db stuff to do the queries, making your stuff compatible with newer ZC versions.
I don't have a CEON URI site to test it on, but I think I've converted it correctly.
Code:// display categories to select from
$categories = $db->Execute("SELECT * FROM " . TABLE_CATEGORIES . " c LEFT JOIN " . TABLE_CATEGORIES_DESCRIPTION . " cd ON c.categories_id = cd.categories_id WHERE c.categories_status='1'");
echo "<p>Click on a category to update its products: <br/>";
while (!$categories->EOF) {
echo "<a href='update-ceon-uri.php?updatecategory={$categories->fields['categories_id']}'>{$categories->fields['categories_name']}</a>, \n";
$categories->MoveNext();
}
echo "</p>\n<hr/>\n";
$replacechars = array("(",")","'","\"","$","%","&"); // specify all characters to be eliminated
// update all products in category
$_GET['updatecategory'] = (int)$_GET['updatecategory'];
$updateuris = $db->Execute("SELECT * FROM " . TABLE_PRODUCTS . " WHERE master_categories_id='{$_GET['updatecategory']}'");
while (!$updateuris->EOF)) {
$thisuri = $updateuris->fields;
unset($catname);
$productsid = $thisuri['products_id'];
$productsname = zen_get_products_name($productsid);
if($productsname == '') continue; // skip empty names
$result = $db->Execute("SELECT uri FROM " . TABLE_CEON_URI_MAPPINGS . " WHERE main_page='index' AND associated_db_id='{$thisuri['master_categories_id']}'");
$catname = $result->fields['uri'];
$newuri = $catname."/".strtolower(str_replace(" ","-",$productsname));
//$newuri = "/".strtolower(str_replace(" ","-",$productsname)); // product-only on this site
// remove characters in the array above
$newuri = str_replace($replacechars,"",$newuri);
$today = date('Y-m-d G:i:s'); // today
// check if product already exists to do update vs insert
$result = $db->Execute("SELECT * FROM " . TABLE_CEON_URI_MAPPINGS . " WHERE main_page='product_info' AND associated_db_id='$productsid'");
$exists = $result->RecordCount();
if ($exists) { // if already in TABLE_CEON_URI_MAPPINGS, update
$db->Execute("UPDATE " . TABLE_CEON_URI_MAPPINGS . " SET uri='$newuri' WHERE main_page='product_info' AND associated_db_id='$productsid'");
$status = "Updated. ";
} else { // else, insert
$db->Execute("INSERT IGNORE INTO " . TABLE_CEON_URI_MAPPINGS . "
(`uri`, `language_id`, `current_uri`, `main_page`, `query_string_parameters`, `associated_db_id`, `alternate_uri`, `redirection_type_code`, `date_added`) VALUES
('$newuri','1','1','product_info',NULL,'$productsid',NULL,NULL,'$today')");
$status = "Inserted. ";
}
// display whether updated or inserted and any problems encountered
echo "<p>$newuri (cat: {$thisuri['master_categories_id']}) - $status</p>\n";
$updateuris->MoveNext();
}
Hi,
I am not sure I understood how to use the code above, I mean how to make in work.
bobthemolder said to copy it in a amdin page but I did it in the categories.php page and all what I get is a blank page (zen cart v1.5.5)
Can you please explain it in more details?
Thanks
enzo
You don't need to understand it: there is now a 155 version available for download. Simply install that!
Thanks but there is not a version that does this
as bobthemolder said.Quote:
auto generate CEON product URIs - it's crude but it's worked well for me, and it's free. Simply copy one of the admin pages and drop the code in, run as needed to update product URIs.
I like to understand and experimet, however.
Ciao
enzo