{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "landingPage": "/track-orders?tracking_number=ORD-10041",
  "preferredVersions": {
    "php": "8.3",
    "wp": "latest"
  },
  "phpExtensionBundles": [
    "kitchen-sink"
  ],
  "features": {
    "networking": true
  },
  "steps": [
    {
      "step": "login",
      "username": "admin",
      "password": "password"
    },
    {
      "step": "setSiteOptions",
      "options": {
        "blogname": "Order Tracking Demo",
        "blogdescription": "A live preview of the Order Tracking plugin"
      }
    },
    {
      "step": "installTheme",
      "themeData": {
        "resource": "wordpress.org/themes",
        "slug": "blocksy"
      },
      "options": {
        "activate": true
      }
    },
    {
      "step": "writeFile",
      "path": "/wordpress/wp-content/mu-plugins/custom-styles.php",
      "data": "<?php add_action('wp_head', function() { echo '<style>.ewd-otp-update{flex-basis:100%;order:2;font-size:12px;font-weight:500;color:#3a7d44;background:#f0faf1;border:0.5px solid rgba(58,125,68,0.2);border-radius:6px;padding:6px 12px;margin-top:-16px;}.ewd-otp-field-label,.ewd-otp-tracking-results-label{letter-spacing:.05em;font-weight:500;text-transform:uppercase}.ewd-otp-statuses,.ewd-otp-statuses-header{margin:2px 5px 6px!important}.ewd-otp-btn,.ewd-otp-submit,.view-admin-orders,input[name=ewd_otp_update_status_and_location]{display:inline-block;position:relative;font-size:13px;font-weight:500;color:#fff;background:#1a1a1a;text-decoration:none;border:none;border-radius:6px;padding:7px 16px;cursor:pointer;overflow:hidden;white-space:nowrap;transition:background .2s,transform .15s,box-shadow .2s;box-shadow:0 1px 2px rgba(0,0,0,.15)}.ewd-otp-btn::after,.ewd-otp-submit::after,.view-admin-orders::after,input[name=ewd_otp_update_status_and_location]::after{content:\"\";position:absolute;inset:0;background:rgba(255,255,255,0);transition:background .2s}.ewd-otp-btn:hover,.ewd-otp-submit:hover,.view-admin-orders:hover,input[name=ewd_otp_update_status_and_location]:hover{background:#111;transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.25);color:#fff;text-decoration:none}.ewd-otp-btn:hover::after,.ewd-otp-submit:hover::after,.view-admin-orders:hover::after,input[name=ewd_otp_update_status_and_location]:hover::after{background:rgba(255,255,255,.06)}.ewd-otp-btn:active,.ewd-otp-submit:active,.view-admin-orders:active,input[name=ewd_otp_update_status_and_location]:active{transform:translateY(0);box-shadow:0 1px 3px rgba(0,0,0,.2);transition:transform 80ms,box-shadow 80ms}.view-admin-orders{display:block;width:max-content;margin-top:10px}.ewd-otp-form{display:flex;gap:24px;align-items:flex-start;flex-wrap:wrap}.ewd-otp-order-tracking-form-div{flex:1;min-width:220px;background:#fff;border:.5px solid rgba(0,0,0,.12);border-radius:12px;padding:20px 24px}.ewd-otp-order-tracking-form-div h3{font-size:15px;font-weight:600;margin:0 0 6px;color:#1a1a1a}.ewd-otp-tracking-form-instructions{font-size:13px;color:#888;margin-bottom:16px}.ewd-otp-tracking-form{display:flex;gap:8px;align-items:flex-end}.ewd-otp-form-identifier{flex:1}.ewd-otp-field-label{display:block;font-size:11px;color:#888;margin-bottom:5px}.ewd-otp-form-identifier input[type=text]{width:100%;font-size:13px;color:#1a1a1a;background:#fff;border:.5px solid rgba(0,0,0,.18);border-radius:6px;padding:7px 10px;outline:0;box-sizing:border-box;transition:border-color .15s}.ewd-order-status select:focus,.ewd-otp-form-identifier input[type=text]:focus{border-color:rgba(0,0,0,.38);box-shadow:0 0 0 3px rgba(0,0,0,.05)}.ewd-otp-form-submit{flex-shrink:0}.ewd-otp-tracking-results{flex:1;min-width:280px}.ewd-otp-order-results{background:#fff;border:.5px solid rgba(0,0,0,.12);border-radius:12px;overflow:hidden}.ewd-otp-tracking-results-field{display:flex;align-items:baseline;gap:12px;padding:12px 20px;border-bottom:.5px solid rgba(0,0,0,.07)}.ewd-otp-tracking-results-field:last-of-type{border-bottom:none}.ewd-otp-tracking-results-label{font-size:12px;color:#888;min-width:110px;flex-shrink:0}.ewd-otp-tracking-results-value{font-size:14px;color:#1a1a1a;line-height:1.5}.ewd-otp-print-results{font-size:13px;font-weight:500;color:#555;background:0 0;border:.5px solid rgba(0,0,0,.18);border-radius:6px;padding:6px 14px;cursor:pointer;transition:background .15s,border-color .15s}.ewd-otp-print-results:hover{background:#f5f5f5;border-color:rgba(0,0,0,.28)}.ewd-otp-front-end-update-form,.ewd-otp-statuses{border-top:.5px solid rgba(0,0,0,.07)}.ewd-otp-status-label{display:flex;gap:1px;background:rgba(0,0,0,.07)}.ewd-otp-statuses,.ewd-otp-statuses-header{flex:1;padding:8px 20px}.ewd-otp-statuses-header{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#888;background:#fafafa}.ewd-order-status select,.ewd-otp-statuses{font-size:13px;color:#1a1a1a;background:#fff}.ewd-otp-front-end-update-form{padding:16px 20px;background:#fafafa}.ewd-otp-update-status-and-location{display:flex;align-items:center;gap:10px;display:flex;width:100%;justify-content:space-between}.ewd-order-status select{border:.5px solid rgba(0,0,0,.18);border-radius:6px;padding:7px 10px;outline:0;cursor:pointer;transition:border-color .15s}.ewd-otp-update-status-and-location div{width:initial !important}</style>'; });"
    },
    {
      "step": "runPHP",
      "code": "<?php\nrequire_once 'wordpress/wp-load.php';\n\nupdate_option( 'ewd-otp-settings', array(\n    'display-print-button' => '1',\n    'email-messages' => json_encode( array(\n        array(\n            'id'      => 1,\n            'name'    => 'Default',\n            'subject' => 'Order Status Update',\n            'message' => 'Hello [order-name], You have an update for your order [order-number]!',\n        ),\n    ) ),\n    'statuses' => json_encode( array(\n        array( 'status' => 'Pending Payment', 'percentage' => '25',  'email' => 1, 'internal' => 'no' ),\n        array( 'status' => 'Processing',      'percentage' => '50',  'email' => 1, 'internal' => 'no' ),\n        array( 'status' => 'On Hold',         'percentage' => '50',  'email' => 1, 'internal' => 'no' ),\n        array( 'status' => 'Completed',       'percentage' => '100', 'email' => 1, 'internal' => 'no' ),\n        array( 'status' => 'Cancelled',       'percentage' => '0',   'email' => 1, 'internal' => 'no' ),\n        array( 'status' => 'Refunded',        'percentage' => '0',   'email' => 1, 'internal' => 'no' ),\n        array( 'status' => 'Failed',          'percentage' => '0',   'email' => 1, 'internal' => 'no' ),\n    ) ),\n) );\n?>"
    },
    {
      "step": "runPHP",
      "code": "<?php\nrequire_once 'wordpress/wp-load.php';\n\nglobal $wpdb;\n$table = $wpdb->prefix . 'EWD_OTP_Orders';\n\n$wpdb->query(\n    \"CREATE TABLE IF NOT EXISTS {$table} (\n        Order_ID INT AUTO_INCREMENT PRIMARY KEY,\n        Order_Name VARCHAR(255),\n        Order_Number VARCHAR(255),\n        Order_Status VARCHAR(255),\n        Order_External_Status VARCHAR(255),\n        Order_Email VARCHAR(255),\n        Order_Display VARCHAR(10),\n        Order_Notes_Public TEXT,\n        Order_Notes_Private TEXT,\n        Order_Customer_Notes TEXT,\n        Order_Status_Updated DATETIME\n    )\"\n);\n\n$orders = array(\n    array(\n        'Order_Name'            => 'Sarah Mitchell',\n        'Order_Number'          => 'ORD-10041',\n        'Order_Status'          => 'Completed',\n        'Order_External_Status' => 'Delivered',\n        'Order_Email'           => 'sarah.mitchell@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'Your order was delivered to the front door. Thank you for shopping with us!',\n        'Order_Notes_Private'   => 'Delivered without issues. Signature waived per customer request.',\n        'Order_Customer_Notes'  => 'Please leave at the front door, do not ring the bell.',\n        'Order_Status_Updated'  => '2026-03-18 09:14:22',\n    ),\n    array(\n        'Order_Name'            => 'James Thornton',\n        'Order_Number'          => 'ORD-10042',\n        'Order_Status'          => 'Processing',\n        'Order_External_Status' => 'Preparing Your Order',\n        'Order_Email'           => 'j.thornton@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'Your order is being prepared and will ship within 1-2 business days.',\n        'Order_Notes_Private'   => 'One item pulled from warehouse B. May delay by 1 day.',\n        'Order_Customer_Notes'  => 'Gift wrap if possible, it\\'s a birthday present.',\n        'Order_Status_Updated'  => '2026-03-24 11:30:05',\n    ),\n    array(\n        'Order_Name'            => 'Priya Kapoor',\n        'Order_Number'          => 'ORD-10043',\n        'Order_Status'          => 'On Hold',\n        'Order_External_Status' => 'Awaiting Payment Confirmation',\n        'Order_Email'           => 'priya.kapoor@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'We are waiting for your payment to clear. Your order will be processed shortly after.',\n        'Order_Notes_Private'   => 'Bank transfer flagged for manual review by payment processor.',\n        'Order_Customer_Notes'  => 'I paid via bank transfer on the 23rd, please confirm receipt.',\n        'Order_Status_Updated'  => '2026-03-23 15:47:38',\n    ),\n    array(\n        'Order_Name'            => 'David Okafor',\n        'Order_Number'          => 'ORD-10044',\n        'Order_Status'          => 'Completed',\n        'Order_External_Status' => 'Delivered',\n        'Order_Email'           => 'david.okafor@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'Your order has been delivered. We hope you enjoy your purchase!',\n        'Order_Notes_Private'   => 'Delivered to neighbour at unit 4B. Customer notified via email.',\n        'Order_Customer_Notes'  => 'If I\\'m not home, leave with a neighbour.',\n        'Order_Status_Updated'  => '2026-03-20 13:02:50',\n    ),\n    array(\n        'Order_Name'            => 'Emily Hartmann',\n        'Order_Number'          => 'ORD-10045',\n        'Order_Status'          => 'Pending Payment',\n        'Order_External_Status' => 'Waiting for Payment',\n        'Order_Email'           => 'emily.hartmann@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'We have reserved your items. Please complete payment to confirm your order.',\n        'Order_Notes_Private'   => 'Customer selected pay-by-invoice. Net 7 terms. Follow up if no payment by Mar 31.',\n        'Order_Customer_Notes'  => 'I will be paying by invoice, please send it to my billing email.',\n        'Order_Status_Updated'  => '2026-03-24 08:55:17',\n    ),\n    array(\n        'Order_Name'            => 'Carlos Reyes',\n        'Order_Number'          => 'ORD-10046',\n        'Order_Status'          => 'Processing',\n        'Order_External_Status' => 'Shipped',\n        'Order_Email'           => 'c.reyes@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'Your order has shipped! Estimated delivery is 2-3 business days.',\n        'Order_Notes_Private'   => 'Tracking number: 1Z999AA10123456784. Shipped via UPS Ground.',\n        'Order_Customer_Notes'  => 'Deliver between 9am-5pm only, I work nights.',\n        'Order_Status_Updated'  => '2026-03-25 07:21:44',\n    ),\n    array(\n        'Order_Name'            => 'Natalie Brooks',\n        'Order_Number'          => 'ORD-10047',\n        'Order_Status'          => 'Cancelled',\n        'Order_External_Status' => 'Order Cancelled',\n        'Order_Email'           => 'natalie.brooks@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'Your order has been cancelled as requested. A full refund will appear within 3-5 business days.',\n        'Order_Notes_Private'   => 'Customer cancelled via phone. Reason: found cheaper alternative. Refund issued manually.',\n        'Order_Customer_Notes'  => 'I need to cancel, I ordered the wrong size.',\n        'Order_Status_Updated'  => '2026-03-22 16:09:31',\n    ),\n    array(\n        'Order_Name'            => 'Wei Zhang',\n        'Order_Number'          => 'ORD-10048',\n        'Order_Status'          => 'Completed',\n        'Order_External_Status' => 'Delivered',\n        'Order_Email'           => 'wei.zhang@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'Your order was delivered successfully. Thank you for your purchase!',\n        'Order_Notes_Private'   => 'Express shipping upgrade applied at no charge due to earlier delay on order ORD-10031.',\n        'Order_Customer_Notes'  => 'Please ensure the package is not left in the sun.',\n        'Order_Status_Updated'  => '2026-03-19 10:44:09',\n    ),\n    array(\n        'Order_Name'            => 'Omar Hassan',\n        'Order_Number'          => 'ORD-10049',\n        'Order_Status'          => 'Refunded',\n        'Order_External_Status' => 'Refund Processed',\n        'Order_Email'           => 'omar.hassan@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'Your refund of $74.99 has been processed and should appear in your account within 3-5 business days.',\n        'Order_Notes_Private'   => 'Item returned damaged. Refund approved by manager. Do not restock — dispose of unit.',\n        'Order_Customer_Notes'  => 'The item arrived broken, I have attached photos to my support email.',\n        'Order_Status_Updated'  => '2026-03-21 14:28:57',\n    ),\n    array(\n        'Order_Name'            => 'Jessica Lund',\n        'Order_Number'          => 'ORD-10050',\n        'Order_Status'          => 'Processing',\n        'Order_External_Status' => 'Out for Delivery',\n        'Order_Email'           => 'jessica.lund@example.com',\n        'Order_Display'         => 'Yes',\n        'Order_Notes_Public'    => 'Your order is out for delivery today! Please ensure someone is available to receive it.',\n        'Order_Notes_Private'   => 'Driver attempted at 10:15am, no answer. Second attempt scheduled for this afternoon.',\n        'Order_Customer_Notes'  => 'I have a dog, please knock loudly rather than using the doorbell.',\n        'Order_Status_Updated'  => '2026-03-25 10:33:12',\n    ),\n);\n\nforeach ( $orders as $order ) {\n    $wpdb->insert( $table, $order );\n}\n?>"
    },
    {
      "step": "installPlugin",
      "options": {
        "activate": true
      },
      "pluginData": {
        "resource": "wordpress.org/plugins",
        "slug": "order-tracking"
      }
    },
    {
      "step": "runPHP",
      "code": "<?php\nrequire_once 'wordpress/wp-load.php';\n\n$image_url = 'https://images.unsplash.com/photo-1769144256181-698b8f807066?q=80&w=1932&auto=format&fit=crop';\n\n$image_block = '<!-- wp:image {\"sizeSlug\":\"full\",\"linkDestination\":\"none\",\"align\":\"full\"} -->\n<figure class=\"wp-block-image alignfull size-full\"><img src=\"' . $image_url . '\" alt=\"Track Orders Banner\"/></figure>\n<!-- /wp:image -->';\n\n$text_content = '<!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"2rem\",\"bottom\":\"2rem\",\"left\":\"2rem\",\"right\":\"2rem\"}}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group\" style=\"padding-top:2rem;padding-bottom:2rem;padding-left:2rem;padding-right:2rem\">\n\n<!-- wp:paragraph -->\n<p>Thank you for checking out our Order Tracking plugin!</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>The [[tracking-form]] shortcode is all you need to display the order tracking form on your page — your customers can use it to view real-time order tracking results.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>You can control exactly what gets displayed to your customers (statuses, progress bar, messages, and more) from within the plugin settings.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Additionally, if you are logged in and have the required permissions, you can directly update the status of any order right from the tracking results — just as your customers will see it. <a href=\"/wp-admin/admin.php?page=ewd-otp-orders\" class=\"view-admin-orders\">📋 View Admin Orders Screen</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:shortcode -->[tracking-form]<!-- /wp:shortcode -->\n\n</div>\n<!-- /wp:group -->';\n\nwp_insert_post(\n  array(\n    'post_title'   => 'Track Orders',\n    'post_content' => $image_block . '\n\n' . $text_content,\n    'post_status'  => 'publish',\n    'post_type'    => 'page'\n  )\n);\n?>"
    }
  ],
  "login": true
}
