{"id":1566,"date":"2017-06-02T13:25:30","date_gmt":"2017-06-02T07:55:30","guid":{"rendered":"https:\/\/pheonixsolutions.com\/blog\/?p=1566"},"modified":"2026-09-08T11:31:32","modified_gmt":"2026-09-08T06:01:32","slug":"codeigniter-image-upload-crop-resize","status":"publish","type":"post","link":"https:\/\/pheonixsolutions.com\/blog\/codeigniter-image-upload-crop-resize\/","title":{"rendered":"CodeIgniter Image Upload and Crop, Resize"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Image upload and image editing are common requirements in web applications. CodeIgniter provides built-in libraries for handling file uploads and image manipulation, while jQuery plugins can be used to provide an interactive image cropping interface.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this guide, we will explain how to implement <strong>image upload and cropping in CodeIgniter<\/strong> using the <strong>Jcrop jQuery plugin<\/strong> and CodeIgniter&#8217;s upload and image manipulation libraries.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The implementation allows users to select an image, choose a crop region, and upload the cropped image.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before starting, make sure:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CodeIgniter is installed and configured.<\/li>\n\n\n\n<li>PHP and a web server are available.<\/li>\n\n\n\n<li>jQuery and Jcrop libraries are available.<\/li>\n\n\n\n<li>The application has write permission for the <code>assets<\/code> directory.<\/li>\n\n\n\n<li>Basic knowledge of CodeIgniter, PHP, HTML, JavaScript, and jQuery is recommended.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Implementation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Include jQuery and Jcrop<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Download the following files and link them to your application, or use the CDN links:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>jquery.min.js<\/code><\/li>\n\n\n\n<li><code>jquery.Jcrop.min.js<\/code><\/li>\n\n\n\n<li><code>Jcrop.css<\/code><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;source type=\"text\/javascript\" src=\"http:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.8.1\/jquery.min.js\">&lt;\/source>\n\n&lt;link rel=\"stylesheet\" href=\"http:\/\/jcrop-cdn.tapmodo.com\/v0.9.12\/css\/jquery.Jcrop.css\" type=\"text\/css\" \/>\n\n&lt;source type=\"text\/javascript\" src=\"http:\/\/jcrop-cdn.tapmodo.com\/v0.9.12\/js\/jquery.Jcrop.js\">&lt;\/source><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Create <code>script.js<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a new JavaScript file inside the <code>assets<\/code> folder with the name:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">script.js<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following code:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ convert bytes into friendly format\n\nfunction bytesToSize(bytes) {\n\nvar sizes = ['Bytes', 'KB', 'MB'];\n\nif (bytes == 0) return 'n\/a';\n\nvar i = parseInt(Math.floor(Math.log(bytes) \/ Math.log(1024)));\n\nreturn (bytes \/ Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];\n\n};\n\n\/\/ check for selected crop region\n\nfunction checkForm() {\n\nif (parseInt($('#w').val())) return true;\n\n    $('.error').html('Please select a crop region and then press Upload').show();\n\nreturn false;\n\n};\n\n\/\/ update info by cropping (onChange and onSelect events handler)\n\nfunction updateInfo(e) {\n\n    $('#x1').val(e.x);\n\n    $('#y1').val(e.y);\n\n    $('#x2').val(e.x2);\n\n    $('#y2').val(e.y2);\n\n    $('#w').val(e.w);\n\n    $('#h').val(e.h);\n\n};\n\n\/\/ clear info by cropping (onRelease event handler)\n\nfunction clearInfo() {\n\n    $('.info #w').val('');\n\n    $('.info #h').val('');\n\n};\n\n\/\/ Create variables (in this scope) to hold the Jcrop API and image size\n\nvar jcrop_api, boundx, boundy;\n\nfunction fileSelectHandler() {\n\n\/\/ get selected file\n\nvar oFile = $('#image_file')[0].files[0];\n\n\/\/ hide all errors\n\n    $('.error').hide();\n\n\/\/ check for image type (jpg and png are allowed)\n\nvar rFilter = \/^(image\\\/jpeg|image\\\/png)$\/i;\n\nif (! rFilter.test(oFile.type)) {\n\n        $('.error').html('Please select a valid image file (jpg and png are allowed)').show();\n\nreturn;\n\n}\n\n\/\/ check for file size\n\nif (oFile.size > 250 * 1024) {\n\n        $('.error').html('You have selected too big file, please select a one smaller image file').show();\n\nreturn;\n\n}\n\nif (oFile.size &lt; 300 * 300) {\n\n        $('.error').html('You have selected too small file, please select a one bigger image file').show();\n\nreturn;\n\n}\n\n\/\/ preview element\n\nvar oImage = document.getElementById('preview');\n\n\/\/ prepare HTML5 FileReader\n\nvar oReader = new FileReader();\n\n        oReader.onload = function(e) {\n\n\/\/ e.target.result contains the DataURL which we can use as a source of the image\n\n        oImage.src = e.target.result;\n\n        oImage.onload = function () { \/\/ onload event handler\n\n\/\/ display step 2\n\n            $('.step2').fadeIn(500);\n\n\/\/ display some basic image info\n\nvar sResultFileSize = bytesToSize(oFile.size);\n\n            $('#filesize').val(sResultFileSize);\n\n            $('#filetype').val(oFile.type);\n\n            $('#filedim').val(oImage.naturalWidth + ' x ' + oImage.naturalHeight);\n\n\/\/ destroy Jcrop if it is existed\n\nif (typeof jcrop_api != 'undefined') {\n\njcrop_api.destroy();\n\n                jcrop_api = null;\n\n                $('#preview').width(oImage.naturalWidth);\n\n                $('#preview').height(oImage.naturalHeight);\n\n}\n\nsetTimeout(function(){\n\n\/\/ initialize Jcrop\n\n                $('#preview').Jcrop({\n\n                    minSize: [32, 32], \/\/ min crop size\n\n                    aspectRatio : 1, \/\/ keep aspect ratio 1:1\n\n                    bgFade: true, \/\/ use fade effect\n\n                    bgOpacity: .3, \/\/ fade opacity\n\n                    onChange: updateInfo,\n\n                    onSelect: updateInfo,\n\n                    onRelease: clearInfo\n\n}, function(){\n\n\/\/ use the Jcrop API to get the real image size\n\nvar bounds = this.getBounds();\n\n                    boundx = bounds[0];\n\n                    boundy = bounds[1];\n\n\/\/ Store the Jcrop API in the jcrop_api variable\n\n                    jcrop_api = this;\n\n});\n\n},3000);\n\n};\n\n};\n\n\/\/ read selected file as DataURL\n\noReader.readAsDataURL(oFile);\n\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Create the Crop View<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the CodeIgniter <code>application\/views<\/code> folder, create a view file named:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">crop_view.php<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following script:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$(function(){\n\n    $('#cropbox').Jcrop({\n\n        aspectRatio: 1,\n\n        onSelect: updateCoords\n\n    });\n\n});\n\nfunction updateCoords(c)\n\n{\n\n    $('#x').val(c.x);\n\n    $('#y').val(c.y);\n\n    $('#w').val(c.w);\n\n    $('#h').val(c.h);\n\n};\n\nfunction checkCoords()\n\n{\n\n    if (parseInt($('#w').val())) return true;\n\n    alert('Select where you want to Crop.');\n\n    return false;\n\n};<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Add the Image Upload and Crop Form<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Inside <code>crop_view.php<\/code>, add the following code and link <code>script.js<\/code> created in Step 2.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php $this->load->helper('url');\n&lt;!DOCTYPE html>\n&lt;html>\n&lt;head>\n&lt;title>Crop Image&lt;\/title>\n&lt;source type=\"text\/javascript\" src=\"http:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.8.1\/jquery.min.js\">&lt;\/source>\n\n&lt;link rel=\"stylesheet\" href=\"http:\/\/jcrop-cdn.tapmodo.com\/v0.9.12\/css\/jquery.Jcrop.css\" type=\"text\/css\" \/>\n\n&lt;source type=\"text\/javascript\" src=\"http:\/\/jcrop-cdn.tapmodo.com\/v0.9.12\/js\/jquery.Jcrop.js\">&lt;\/source>\n\n&lt;source type=\"text\/javascript\" src=\"&lt;?=base_url().'assets\/script.js'?>\">&lt;\/source>\n\n&lt;\/head>\n&lt;body>\n\n&lt;form action=\"site_url('crop\/cropImg)?> method=\"post\" onSubmit=\"return checkForm()\" entype=\"multipart\/form-data\">\n\n    &lt;input type=\"hidden\" id=\"x1\" name=\"x1\" \/>\n\n    &lt;input type=\"hidden\" id=\"y1\" name=\"y1\" \/>\n\n    &lt;input type=\"hidden\" id=\"x2\" name=\"x2\" \/>\n\n    &lt;input type=\"hidden\" id=\"y2\" name=\"y2\" \/>\n\n    &lt;input type=\"file\" name=\"image_file\" class=\"loginlink image_class\" id=\"image_file\" onChange=\"fileSelectHandler()\"\/>\n\n    &lt;img id=\"preview\" \/>\n\n    &lt;label class=\"info1\">File size&lt;\/label> &lt;input type=\"text\" class=\"info1\" id=\"filesize\" name=\"filesize\" \/>\n\n    &lt;label class=\"info1\">Type&lt;\/label> &lt;input type=\"text\"  class=\"info1\" id=\"filetype\" name=\"filetype\" \/>\n\n    &lt;label class=\"info1\">Image dimension&lt;\/label> &lt;input type=\"text\"  class=\"info1\" id=\"filedim\" name=\"filedim\" \/>\n\n    &lt;label class=\"info1\">W&lt;\/label> &lt;input type=\"text\" class=\"info1\" id=\"w\" name=\"w\" \/>\n\n    &lt;label class=\"info1\">H&lt;\/label> &lt;input type=\"text\" class=\"info1\" id=\"h\" name=\"h\" \/>\n\n    &lt;input  type=\"submit\" class=\"img-upload\" value=\"Upload\"\/>\n\n&lt;\/form>\n\n&lt;body><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Create the Controller<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Navigate to:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">application\/controllers<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create a file named:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">crop.php<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add the following code:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\ndefined('BASEPATH') OR exit('No direct script access allowed');\n\nclass Crop extends CI_Controller {\n\n\/**\n\n   * Index Page for this controller.\n\n   *\n\n   * Maps to the following URL\n\n   *     http:\/\/example.com\/index.php\/welcome\n\n   *  - or -\n\n   *     http:\/\/example.com\/index.php\/welcome\/index\n\n   *  - or -\n\n   * Since this controller is set as the default controller in\n\n   * config\/routes.php, it's displayed at http:\/\/example.com\/\n\n   *\n\n   * So any other public methods not prefixed with an underscore will\n\n   * map to \/index.php\/welcome\/&lt;method_name>\n\n   * @see https:\/\/codeigniter.com\/user_guide\/general\/urls.html\n\n   *\/\n\npublic function index()\n\n{\n\n$this->load->view('crop_view');\n\n}\n\npublic function cropImg()\n\n{\n\nif ($_FILES)\n\n{\n\n$config['upload_path']   = '.\/assets\/'; \n\n$config['allowed_types'] = '*';    \n\n$config['encrypt_name']= true;\n\n$this->load->library('upload', $config);\n\nif (!is_dir($config['upload_path'])) {\n\nmkdir($config['upload_path'], 0777, TRUE);\n\n}  \n\nif ( ! $this->upload->do_upload('image_file')) {\n\n$error = array('error' => $this->upload->display_errors());           \n\n}\n\nelse\n\n{ \n\n\/\/ $width=200;\n\n\/\/ $height=200;\n\n$up_file_data = $this->upload->data();\n\n$config['image_library'] = 'gd2';\n\n$config['source_image'] = $config['upload_path'].'\/'.$up_file_data['file_name'];\n\n$config['x_axis'] = $this->input->post('x1');\n\n$config['y_axis'] = $this->input->post('y1');\n\n$config['maintain_ratio'] = FALSE;\n\n$config['width'] = $this->input->post('w');\n\n$config['height'] = $this->input->post('h');\n\n$config['quality'] = '90%';\n\n$this->load->library('image_lib', $config);\n\n$this->image_lib->crop();\n\n} \n\n} \n\n}\n\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The controller performs the upload and uses CodeIgniter&#8217;s image library to crop the uploaded image according to the coordinates submitted by the form.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CodeIgniter can be used together with the Jcrop jQuery plugin to provide an interactive image upload and crop feature. The client-side JavaScript handles image selection and crop coordinates, while the CodeIgniter controller processes the uploaded image and performs the crop operation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This approach can be useful for profile images, product images, thumbnails, and other applications where users need to select a specific portion of an uploaded image.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQs<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">1. What is Jcrop used for?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Jcrop is used to provide an interactive image cropping interface where users can select the portion of an image they want to crop.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Which CodeIgniter library is used for image cropping?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The implementation uses CodeIgniter&#8217;s <code>image_lib<\/code> library with the <code>gd2<\/code> image library.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Where is the uploaded image stored?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The uploaded image is stored in the <code>.\/assets\/<\/code> directory configured in the controller.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. What image formats are accepted in this implementation?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The JavaScript validation allows <strong>JPEG and PNG<\/strong> images.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5. Can the crop size be controlled?<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. The Jcrop configuration uses:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">minSize: [32, 32]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">aspectRatio : 1<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This creates a minimum crop size and keeps the crop area square.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Related Articles<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">Send Email Using HTML Templates in CodeIgniter<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Learn how to send emails using HTML templates in a CodeIgniter application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/pheonixsolutions.com\/blog\/send-email-using-html-templates-codeigniter\/\">https:\/\/pheonixsolutions.com\/blog\/send-email-using-html-templates-codeigniter\/<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Currency Conversion and Symbol Library in CodeIgniter<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Learn how to implement currency conversion and work with currency symbols in CodeIgniter applications.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/pheonixsolutions.com\/blog\/currency-conversion-and-symbol-library-in-codeigniter\">https:\/\/pheonixsolutions.com\/blog\/currency-conversion-and-symbol-library-in-codeigniter<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Talk to our experts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Looking for the right technology solution for your business? Our team of experts can help you with development, cloud, DevOps, design, and a wide range of other technology needs. Get in touch with our team&nbsp;<a href=\"https:\/\/pheonixsolutions.com\/contact\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Image upload and image editing are common requirements in web applications. CodeIgniter provides built-in libraries for handling file uploads [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1022],"tags":[341,273],"class_list":["post-1566","post","type-post","status-publish","format-standard","hentry","category-web-architecture","tag-codeigniter","tag-php","psol-cat-web-architecture"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/phn2x7-pg","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/1566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/comments?post=1566"}],"version-history":[{"count":1,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/1566\/revisions"}],"predecessor-version":[{"id":11523,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/posts\/1566\/revisions\/11523"}],"wp:attachment":[{"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/media?parent=1566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/categories?post=1566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pheonixsolutions.com\/blog\/wp-json\/wp\/v2\/tags?post=1566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}