{"id":325627,"date":"2026-06-18T16:05:51","date_gmt":"2026-06-18T16:05:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/personalize-my-order\/"},"modified":"2026-06-18T16:27:05","modified_gmt":"2026-06-18T16:27:05","slug":"personalize-my-order","status":"publish","type":"plugin","link":"https:\/\/es-mx.wordpress.org\/plugins\/personalize-my-order\/","author":23413993,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Personalize My Order","header_author":"Jay Suthar","header_description":"Collect product customization data after order placement via a secure tokenized URL. Supports custom meta fields, local file uploads, partial saves, and per-item completion tracking.","assets_banners_color":"fdfcfe","last_updated":"2026-06-18 16:27:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":103,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jsjack74","date":"2026-06-18 16:27:05"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":0},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3577521,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3577521,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3577521,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3577521,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3577521,"resolution":"1","location":"assets","locale":"","width":1920,"height":911},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3577521,"resolution":"2","location":"assets","locale":"","width":1417,"height":502},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3577521,"resolution":"3","location":"assets","locale":"","width":1759,"height":790},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3577521,"resolution":"4","location":"assets","locale":"","width":1759,"height":1227},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3577521,"resolution":"5","location":"assets","locale":"","width":1463,"height":721},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3577521,"resolution":"6","location":"assets","locale":"","width":735,"height":585}},"screenshots":{"1":"Customization form as seen by the customer \u2014 tabbed per order item","2":"Admin order detail page showing submitted customization data and file links","3":"WooCommerce orders list with customization status column","4":"Settings page \u2014 general and appearance options","5":"Per-product field builder meta box on the product edit page","6":"My Account \u2014 customer's customization overview tab"}},"plugin_section":[],"plugin_tags":[2759,223311,7116,200324,286],"plugin_category":[45],"plugin_contributors":[252960],"plugin_business_model":[],"class_list":["post-325627","plugin","type-plugin","status-publish","hentry","plugin_tags-customization","plugin_tags-order-customization","plugin_tags-personalize","plugin_tags-product-customization","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-jsjack74","plugin_committers-jsjack74"],"banners":{"banner":"https:\/\/ps.w.org\/personalize-my-order\/assets\/banner-772x250.png?rev=3577521","banner_2x":"https:\/\/ps.w.org\/personalize-my-order\/assets\/banner-1544x500.png?rev=3577521","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/personalize-my-order\/assets\/icon-128x128.png?rev=3577521","icon_2x":"https:\/\/ps.w.org\/personalize-my-order\/assets\/icon-256x256.png?rev=3577521","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/personalize-my-order\/assets\/screenshot-1.png?rev=3577521","caption":"Customization form as seen by the customer \u2014 tabbed per order item"},{"src":"https:\/\/ps.w.org\/personalize-my-order\/assets\/screenshot-2.png?rev=3577521","caption":"Admin order detail page showing submitted customization data and file links"},{"src":"https:\/\/ps.w.org\/personalize-my-order\/assets\/screenshot-3.png?rev=3577521","caption":"WooCommerce orders list with customization status column"},{"src":"https:\/\/ps.w.org\/personalize-my-order\/assets\/screenshot-4.png?rev=3577521","caption":"Settings page \u2014 general and appearance options"},{"src":"https:\/\/ps.w.org\/personalize-my-order\/assets\/screenshot-5.png?rev=3577521","caption":"Per-product field builder meta box on the product edit page"},{"src":"https:\/\/ps.w.org\/personalize-my-order\/assets\/screenshot-6.png?rev=3577521","caption":"My Account \u2014 customer's customization overview tab"}],"raw_content":"<!--section=description-->\n<p>Personalize My Order lets you collect product customization details from customers <em>after<\/em> they place an order \u2014 without blocking the checkout flow.<\/p>\n\n<p>Once an order is paid, the customer receives a secure, time-limited link by email. They visit a dedicated customization page on your store, fill in the fields you've configured for each product, and submit. You see everything neatly displayed on the WooCommerce order detail page.<\/p>\n\n<p><strong>Key features:<\/strong><\/p>\n\n<ul>\n<li>Secure tokenized URLs \u2014 HMAC-SHA256 signed, time-limited (configurable expiry), works for both guests and logged-in customers<\/li>\n<li>Per-product custom fields \u2014 configure different fields for each product, or set global fallback fields that apply to all products<\/li>\n<li>13 field types \u2014 text, textarea, select, radio, checkbox, file, number, email, URL, date, color, range, and tel<\/li>\n<li>Local file uploads \u2014 uploaded files are stored securely in your WordPress uploads directory (<code>wp-content\/uploads\/persmyor-uploads\/<\/code>); directory listing is blocked via <code>.htaccess<\/code><\/li>\n<li>Partial saves \/ autosave \u2014 customers can save a draft and come back later; the form autosaves on tab close<\/li>\n<li>Per-item completion tracking \u2014 each order item is tracked independently as pending, partial, or complete<\/li>\n<li>Admin display \u2014 submitted values shown inline on the order detail page, with a dedicated meta box and a status column on the orders list<\/li>\n<li>My Account integration \u2014 customers can review and complete pending customizations from their My Account page<\/li>\n<li>Developer hooks \u2014 filter fields per product or act when an order is fully customized<\/li>\n<\/ul>\n\n<h3>Configuration<\/h3>\n\n<h4>General<\/h4>\n\n<ul>\n<li><strong>Token expiry<\/strong> \u2014 number of days before the customization link expires (default: 30)<\/li>\n<li><strong>Send email on order<\/strong> \u2014 toggle the customization email sent to the customer after payment<\/li>\n<\/ul>\n\n<h4>Global fields<\/h4>\n\n<p>Define fallback fields that apply to all products that don't have their own field configuration. Use the drag-and-drop field builder to add, reorder, and remove fields.<\/p>\n\n<h4>Per-product fields<\/h4>\n\n<p>On any product edit page, a <strong>Customization Fields<\/strong> meta box lets you configure fields specific to that product. These take priority over global fields.<\/p>\n\n<h3>Field types<\/h3>\n\n<p>The following field types are supported in the field builder:<\/p>\n\n<ul>\n<li><strong>text<\/strong> \u2014 single-line text input<\/li>\n<li><strong>textarea<\/strong> \u2014 multi-line text input<\/li>\n<li><strong>select<\/strong> \u2014 dropdown with predefined options<\/li>\n<li><strong>radio<\/strong> \u2014 radio button group<\/li>\n<li><strong>checkbox<\/strong> \u2014 single checkbox or multi-checkbox group<\/li>\n<li><strong>file<\/strong> \u2014 file upload (stored in your server's uploads directory); supports <code>accept<\/code> (MIME types) and <code>max_size<\/code> (in MB)<\/li>\n<li><strong>number<\/strong> \u2014 numeric input; supports <code>min<\/code>, <code>max<\/code>, <code>step<\/code><\/li>\n<li><strong>email<\/strong> \u2014 email address with format validation<\/li>\n<li><strong>url<\/strong> \u2014 URL with format validation<\/li>\n<li><strong>date<\/strong> \u2014 date picker<\/li>\n<li><strong>color<\/strong> \u2014 color picker<\/li>\n<li><strong>range<\/strong> \u2014 range slider; supports <code>min<\/code>, <code>max<\/code>, <code>step<\/code><\/li>\n<li><strong>tel<\/strong> \u2014 telephone number input<\/li>\n<\/ul>\n\n<h3>How it works<\/h3>\n\n<ol>\n<li>Customer places an order on your WooCommerce store.<\/li>\n<li>A secure HMAC-signed token is generated and stored against the order.<\/li>\n<li>After payment, the customer receives an email with a unique customization link (also appended to standard WooCommerce customer emails).<\/li>\n<li>The customer opens the link, fills in the form for each ordered product, and submits.<\/li>\n<li>Submitted values are saved as WooCommerce order item meta.<\/li>\n<li>The admin sees the customization data on the order detail page, along with uploaded file links and a completion status badge.<\/li>\n<li>When all items are complete, an order note is added and the <code>persmyor_order_fully_customized<\/code> action fires.<\/li>\n<\/ol>\n\n<h3>Developer hooks<\/h3>\n\n<h4>Filters<\/h4>\n\n<p><strong><code>persmyor_product_fields<\/code><\/strong>\nModify the resolved field definitions for a product before the form is rendered or data is validated.<\/p>\n\n<pre><code>add_filter( 'persmyor_product_fields', function( $fields, $product_id, $product ) {\n    \/\/ Add, remove, or modify fields\n    return $fields;\n}, 10, 3 );\n<\/code><\/pre>\n\n<h4>Actions<\/h4>\n\n<p><strong><code>persmyor_order_fully_customized<\/code><\/strong>\nFires when every customizable item in an order has been submitted with status <code>complete<\/code>. Receives the <code>WC_Order<\/code> object.<\/p>\n\n<pre><code>add_action( 'persmyor_order_fully_customized', function( $order ) {\n    \/\/ e.g. trigger production workflow\n} );\n<\/code><\/pre>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>personalize-my-order<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>WooCommerce must be active \u2014 the plugin will show an admin notice if it isn't.<\/li>\n<li>On activation, a <strong>Order Customization<\/strong> page is created automatically with the <code>[persmyor_customization_form]<\/code> shortcode. Do not delete this page.<\/li>\n<li>Go to <strong>WooCommerce \u2192 Settings \u2192 Personalize My Order<\/strong> to configure the plugin.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20work%20for%20guest%20customers%3F\"><h3>Does the plugin work for guest customers?<\/h3><\/dt>\n<dd><p>Yes. The tokenized URL is emailed to the billing address and works without requiring the customer to log in.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20customer%20doesn%27t%20complete%20customization%3F\"><h3>What happens if the customer doesn't complete customization?<\/h3><\/dt>\n<dd><p>The order item stays in <code>pending<\/code> or <code>partial<\/code> status. You can see incomplete items in the orders list column and on the order detail page. The customer can return to the customization page at any time before the token expires.<\/p><\/dd>\n<dt id=\"can%20i%20set%20different%20fields%20for%20different%20products%3F\"><h3>Can I set different fields for different products?<\/h3><\/dt>\n<dd><p>Yes. Add fields via the <strong>Customization Fields<\/strong> meta box on each product edit page. Products without their own fields fall back to the global fields configured in settings.<\/p><\/dd>\n<dt id=\"where%20are%20uploaded%20files%20stored%3F\"><h3>Where are uploaded files stored?<\/h3><\/dt>\n<dd><p>Files are stored on your own server at <code>wp-content\/uploads\/persmyor-uploads\/{order_id}_{customer_name}\/{product_name}\/<\/code>. The directory is protected with an <code>.htaccess<\/code> file and an <code>index.php<\/code> stub to prevent direct browsing.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20customization%20page%3F\"><h3>Can I change the customization page?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>WooCommerce \u2192 Settings \u2192 Personalize My Order \u2192 Customization Page<\/strong> and choose any published page that contains the <code>[persmyor_customization_form]<\/code> shortcode.<\/p><\/dd>\n<dt id=\"what%20database%20tables%20does%20the%20plugin%20create%3F\"><h3>What database tables does the plugin create?<\/h3><\/dt>\n<dd><p>Two custom tables are created on activation:\n- <code>{prefix}persmyor_item_submissions<\/code> \u2014 tracks per-item submission status and timestamps\n- <code>{prefix}persmyor_uploaded_files<\/code> \u2014 logs uploaded file metadata and local URLs<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<p>Initial release \u2014 no upgrade steps required.<\/p>","raw_excerpt":"Collect product customization data after order placement via a secure tokenized URL. Supports custom fields, local file uploads, partial saves, and pe &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/325627","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=325627"}],"author":[{"embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jsjack74"}],"wp:attachment":[{"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=325627"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=325627"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=325627"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=325627"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=325627"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=325627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}