{"id":32067,"date":"2026-02-16T09:06:07","date_gmt":"2026-02-16T15:06:07","guid":{"rendered":"https:\/\/wpengine.com\/builders\/?p=32067"},"modified":"2026-02-26T10:09:13","modified_gmt":"2026-02-26T16:09:13","slug":"customizing-wp-engines-newsroom-publication-checklist","status":"publish","type":"post","link":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/","title":{"rendered":"Customizing WP Engine\u2019s Newsroom Publication Checklist"},"content":{"rendered":"\n<p>In the publisher workflow, checklists are important to ensure that you don\u2019t miss anything. Imagine how messy or unorganized things can get without checklists in your everyday life, let alone content you are writing for work.<\/p>\n\n\n\n<p>In WordPress, WP Engine\u2019s Newsroom features the Publication Checklist. It is a customizable quality-control tool that ensures all editorial standards are met before a story goes live.&nbsp;<\/p>\n\n\n\n<p>The publication checklist helps you move away from time-consuming administrative content checks. Completely configurable to your requirements, the checklist flags missing items in real-time to editors before publishing, and gives customized suggestions to make sure your content meets everything you need it to.<\/p>\n\n\n\n<p>In this article, I will walk you through how to customize and use these features as well as integrate them with a work management software. In this example, I will use <a href=\"https:\/\/asana.com\/\">Asana\u00ae\u00b9<\/a>. We will cover these points:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JSON config customized to your editorial guidelines<\/li>\n\n\n\n<li>Custom Fields to render the custom guideline <\/li>\n\n\n\n<li>Create blocking checks that stop publishing<\/li>\n\n\n\n<li>Visual indicator of progress<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Just a Note:<\/strong> If you want a full explanation of all the features and default settings you can choose, please refer to the <a href=\"https:\/\/docs.media.press\/\">official documentation<\/a>. This article will focus on the Publication Checklist feature and customization.<\/p>\n\n\n\n<p>If you prefer a video version of this article, please reference it below:<\/p>\n\n\n\n<iframe class=\"youtube-video\"  src=\"https:\/\/www.youtube.com\/embed\/K5yP9TkCM60\" title=\"Customizing WP Engine\u2019s Newsroom Publication Checklist\" frameborder=\"0\" style=\"display: block; margin: auto; width: 100%; height: 400px;\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n\n\n\n<div class=\"wp-block-group has-polar-background-color has-background is-layout-flow wp-container-core-group-is-layout-7a03825d wp-block-group-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--40)\">\n<p class=\"has-large-font-size\"><strong>Table of Contents<\/strong><\/p>\n\n\n\n<ul id=\"Prerequisites\" class=\"wp-block-list\">\n<li id=\"Prerequisites\"><a href=\"#prerequisites\">Prerequisites<\/a><\/li>\n\n\n\n<li><a href=\"#steps-for-setup\">Steps for setting up<\/a><\/li>\n\n\n\n<li id=\"steps-for-setting-up\"><a href=\"#the-checklist-json-file\">The checklist.json File<\/a><\/li>\n\n\n\n<li><a href=\"#customizing-the-json-file\">Customizing The JSON File<\/a><\/li>\n\n\n\n<li><a href=\"#fields-json-file\">The fields.json File<\/a><\/li>\n\n\n\n<li><a href=\"#connecting-with-asana\" type=\"internal\" id=\"#connecting-with-asana\">Connecting With Asana<\/a><\/li>\n\n\n\n<li><a href=\"#asana-api-and-personal-access-token\" type=\"internal\" id=\"#asana-api-and-personal-access-token\">Asana API And Personal Access Token<\/a><\/li>\n\n\n\n<li><a href=\"#configure-your-asana-credentials\" type=\"internal\" id=\"#configure-your-asana-credentials\">Configure Your Asana Credentials<\/a><\/li>\n\n\n\n<li><a href=\"#class-asana-client-php-file\" type=\"internal\" id=\"#class-asana-client-php-file\">The class-asana-client.php File<\/a><\/li>\n\n\n\n<li><a href=\"#class-asana-integration-php-file\" type=\"internal\" id=\"#class-asana-integration-php-file\">The class-asana-integration.php File<\/a><\/li>\n\n\n\n<li><a href=\"#class-mpc-init-file\">The class-mpc-init.php File<\/a><\/li>\n\n\n\n<li><a href=\"#conclusion\" type=\"internal\" id=\"#conclusion\">Conclusion<\/a><\/li>\n<\/ul>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prerequisites\">Prerequisites<\/h2>\n\n\n\n<p>To benefit from this article, you should be familiar with the basics of working with the<a href=\"https:\/\/wp-cli.org\/\"> command line (WP-CLI)<\/a> and WordPress development.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"steps-for-setup\">Steps for setting up:<\/h2>\n\n\n\n<p>1.Either set up a WordPress install on WP Engine or spin one up locally using Local. For this article, I am using Local.<\/p>\n\n\n\n<p>2.Add a Newsroom license. Once you get a Newsroom license, you will have access to the code and repository.<\/p>\n\n\n\n<p>3.Download the latest version of the plugin off the core repository once you have access to it. Upload the plugin into your WordPress install. You should now see a MediaPress option in your WP Admin side menu like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\" style=\"margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)\"><img loading=\"lazy\" decoding=\"async\" width=\"679\" height=\"1024\" src=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-679x1024.png\" alt=\"\" class=\"wp-image-32068\" srcset=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-679x1024.png 679w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-199x300.png 199w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-768x1159.png 768w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image.png 924w\" sizes=\"auto, (max-width: 679px) 100vw, 679px\" \/><\/figure>\n\n\n\n<p>&nbsp;4. The next plugin you will need is the simple example extension I created for the Asana connection. We will need to add the plugin extension to our WordPress install. Grab the code <a href=\"https:\/\/github.com\/Fran-A-Dev\/mediapress-simple-asana-checklist\">here from this repo<\/a>. Clone the repo directly into your \/wp-content\/plugins\/ directory. It lives in the&nbsp; <code>mediapress-simple<\/code> folder.&nbsp; Once you have this added to your WP install, You should see the plugin within the dashboard. You can go ahead and activate it.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\" style=\"margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"267\" src=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-11.54.57\u202fAM-1024x267.png\" alt=\"\" class=\"wp-image-32069\" srcset=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-11.54.57\u202fAM-1024x267.png 1024w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-11.54.57\u202fAM-300x78.png 300w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-11.54.57\u202fAM-768x201.png 768w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-11.54.57\u202fAM-1536x401.png 1536w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-11.54.57\u202fAM.png 1739w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Now that we have both plugins needed, we need to make sure our settings are properly configured.<\/p>\n\n\n\n<p>If you are accessing this for the first time, you will see the setup wizard allowing you to enable your required features, including the checklist. Once enabled you will have access to toggle the <strong>Demo Config<\/strong> option on or off.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-346627ba wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-large\" style=\"margin-top:var(--wp--preset--spacing--30);margin-bottom:var(--wp--preset--spacing--30)\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"740\" src=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-2-1024x740.png\" alt=\"\" class=\"wp-image-32071\" srcset=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-2-1024x740.png 1024w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-2-300x217.png 300w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-2-768x555.png 768w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-2-1536x1111.png 1536w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-2.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\" style=\"margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"468\" src=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-1-1024x468.png\" alt=\"\" class=\"wp-image-32070\" srcset=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-1-1024x468.png 1024w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-1-300x137.png 300w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-1-768x351.png 768w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-1-1536x702.png 1536w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-1.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n\n<p>In the WP admin sidebar you will see the <strong>MediaPress<\/strong> option. Select Checklist and make sure that the <strong>Use Demo Config<\/strong> option is toggled off. This will allow you to use the simple example instead.<\/p>\n\n\n\n<p>We are all set up! Now, let&#8217;s dive into the customization.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"the-checklist-json-file\">The checklist.json File<\/h3>\n\n\n\n<p>Let\u2019s take a look at the JSON file for the Publication Checklist. Go to <code>mediapress-simple\/config\/checklist.json<\/code> in your project. You should see a structure that defines an array of checklist items, where each item is a small rule that MediaPress evaluates against a post. Each item includes:<br><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A stable name identifier<\/li>\n\n\n\n<li>A human-readable title<\/li>\n\n\n\n<li>An item type (blocking, non_blocking, or info)<\/li>\n\n\n\n<li>An optional check block describing the validation operator (exists\/min\/max\/range)<\/li>\n\n\n\n<li>Messages shown in the UI for pass\/fail\/info states<\/li>\n\n\n\n<li>PostTypes to scope the rule<br><\/li>\n<\/ul>\n\n\n\n<p>Refer to <a href=\"https:\/\/github.com\/mediapress-hq\/mediapress-config-examples\/blob\/simple\/config\/checklist.json\">the link here<\/a> for the JSON file in the GitHub repo.<\/p>\n\n\n\n<p>The publication checklist is entirely configuration-driven. This allows customisation based on specific requirements. To define additional checklist items, simply&nbsp; add a new rule in the JSON schema. MediaPress takes care of validation, UI rendering, and blocking behavior. In this example, two new rules have been added: a rule for legal review checks and a featured image check before publishing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"customizing-the-json-file\"><strong>Customizing The JSON File<\/strong>s<\/h3>\n\n\n\n<p>The first thing we have to do is add the two rules directly to our <code>checklist.json<\/code> file. I went ahead and added them:<\/p>\n\n\n<pre class=\"wp-block-code has-tiny-font-size\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>{\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"has_featured_image\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"title\"<\/span>: <span class=\"hljs-string\">\"Has featured image\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"non_blocking\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"check\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"exists\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">\"sourceKey\"<\/span>: <span class=\"hljs-string\">\"meta._thumbnail_id\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>      },\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"messages\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">\"pass\"<\/span>: <span class=\"hljs-string\">\"Featured image is set\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">\"fail\"<\/span>: <span class=\"hljs-string\">\"Featured image is missing\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>      },\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"postTypes\"<\/span>: &#91;<span class=\"hljs-string\">\"post\"<\/span>]\n<\/span><\/span><span class='shcb-loc'><span>    },\n<\/span><\/span><span class='shcb-loc'><span>    {\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"name\"<\/span>: <span class=\"hljs-string\">\"legal_review_complete\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"title\"<\/span>: <span class=\"hljs-string\">\"Legal review completed\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"blocking\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"check\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">\"type\"<\/span>: <span class=\"hljs-string\">\"exists\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">\"sourceKey\"<\/span>: <span class=\"hljs-string\">\"meta.legal_review\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>      },\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"messages\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">\"pass\"<\/span>: <span class=\"hljs-string\">\"Legal review completed\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">\"fail\"<\/span>: <span class=\"hljs-string\">\"Legal review is required before publishing\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>      },\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-string\">\"postTypes\"<\/span>: &#91;<span class=\"hljs-string\">\"post\"<\/span>]\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Here is the breakdown of the rules I added:<\/p>\n\n\n\n<p><strong>1. has_featured_image (Non-blocking)<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Checks:<\/strong> WordPress featured image via meta._thumbnail_id.<\/li>\n\n\n\n<li><strong>Type:<\/strong> Non-blocking (won&#8217;t prevent publishing).<\/li>\n\n\n\n<li><strong>Validation:<\/strong> &#8220;exists&#8221; check, passes if the post has a featured image set.<\/li>\n\n\n\n<li><strong>Asana behavior:<\/strong> Will create a task that marks as complete when the featured image is added.<\/li>\n<\/ul>\n\n\n\n<p><strong>2. legal_review_complete (Blocking)<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Checks:<\/strong> Custom meta field meta.legal_review.<\/li>\n\n\n\n<li><strong>Type:<\/strong> Blocking (prevents publishing if incomplete).<\/li>\n\n\n\n<li><strong>Validation:<\/strong> &#8220;exists&#8221; check, passes if the legal_review meta field has a value.<\/li>\n\n\n\n<li><strong>Asana behavior:<\/strong> Will create a task that marks complete when the legal review meta is set.<\/li>\n<\/ul>\n\n\n\n<p>Both rules follow the correct structure and will integrate with the Asana sync automatically. The featured image check uses WordPress&#8217;s native _thumbnail_id meta field, while the legal review uses a custom meta field. Once you add your custom rules, the config is loaded dynamically each time, so changes take effect immediately on the next post save.<\/p>\n\n\n\n<p>To access the publication checklist, go to a post and click on the checklist icon with the red dot at the top of the page in the nav. The red dot lets you know that there are tasks yet to be done on the list. You should see this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\" style=\"margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"302\" src=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-12.22.38\u202fPM-1-1024x302.png\" alt=\"\" class=\"wp-image-32073\" srcset=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-12.22.38\u202fPM-1-1024x302.png 1024w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-12.22.38\u202fPM-1-300x89.png 300w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-12.22.38\u202fPM-1-768x227.png 768w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-12.22.38\u202fPM-1-1536x454.png 1536w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-09-at-12.22.38\u202fPM-1.png 1886w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fields-json-file\">The fields.json File<\/h3>\n\n\n\n<p>While <code>checklist.json<\/code> defines the rules, <code>fields.json<\/code> defines the interface and data structure for the custom metadata your editors interact with. In this project, we use this file to register the &#8220;<strong>Legal Review&#8221; <\/strong>checkbox and position it within the MediaPress fields menu under the <strong>&#8220;status&#8221;<\/strong> option.  <\/p>\n\n\n\n<p>Go to <code>mediapress-simple\/config\/fields.json<\/code> in your project. Here is the configuration for the new field:<\/p>\n\n\n<pre class=\"wp-block-code has-tiny-font-size\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"name\"<\/span>: <span class=\"hljs-string\">\"legal_review\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"checkbox\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"label\"<\/span>: <span class=\"hljs-string\">\"Legal Review\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"description\"<\/span>: <span class=\"hljs-string\">\"Legal review status for this post\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"source\"<\/span>: {\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-attr\">\"type\"<\/span>: <span class=\"hljs-string\">\"postMeta\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-attr\">\"key\"<\/span>: <span class=\"hljs-string\">\"legal_review\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>      <span class=\"hljs-attr\">\"registerFor\"<\/span>: &#91;<span class=\"hljs-string\">\"post\"<\/span>]\n<\/span><\/span><span class='shcb-loc'><span>    },\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-attr\">\"options\"<\/span>: &#91;\n<\/span><\/span><span class='shcb-loc'><span>      {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"label\"<\/span>: <span class=\"hljs-string\">\"Legal review completed\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-attr\">\"value\"<\/span>: <span class=\"hljs-string\">\"completed\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>      }\n<\/span><\/span><span class='shcb-loc'><span>    ]\n<\/span><\/span><span class='shcb-loc'><span>  }\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This configuration handles the underlying data logic for your new check. It includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>name:<\/strong> The internal identifier for the field.<\/li>\n\n\n\n<li><strong>type:<\/strong> Defines the UI component (in this case, a checkbox).<\/li>\n\n\n\n<li><strong>source:<\/strong> Instructs MediaPress to save this data as <code>postMeta<\/code> using the key <code>legal_review<\/code>.<\/li>\n\n\n\n<li><strong>registerFor:<\/strong> Limits this field specifically to the <code>post<\/code> post type.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Adding to the Status field group<\/h4>\n\n\n\n<p>Defining the field is only the first half of the process. To make it visible to your editorial team, you must assign it to a field group. In the same <code>fields.json<\/code> file, we update the <strong>Status<\/strong> group:<\/p>\n\n\n<pre class=\"wp-block-code has-tiny-font-size\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-string\">\"fields\"<\/span>: &#91;<span class=\"hljs-string\">\"flag\"<\/span>, <span class=\"hljs-string\">\"legal_review\"<\/span>]\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>By adding <code>legal_review<\/code> to this array, the checkbox appears in the WordPress Admin post editor sidebar under the <strong>Status<\/strong> section. <\/p>\n\n\n\n<p>When you navigate to the status option, you should now see a legal review checkbox. You can test it and it should allow you to check and uncheck it. This will reflect in the checklist as done or not done:<br><\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"416\" src=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-13-at-9.21.10-AM-1024x416.png\" alt=\"\" class=\"wp-image-32088\" srcset=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-13-at-9.21.10-AM-1024x416.png 1024w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-13-at-9.21.10-AM-300x122.png 300w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-13-at-9.21.10-AM-768x312.png 768w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-13-at-9.21.10-AM-1536x624.png 1536w, https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-13-at-9.21.10-AM.png 1877w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"connecting-with-asana\">Connecting With Asana<\/h3>\n\n\n\n<p>In this article, I will use <a href=\"https:\/\/asana.com\/\">Asana<\/a>. I chose it because their API is simple to use and they have a free trial offer for the starter plan. However, please feel free to use whatever project management software your use case calls for.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"asana-api-and-personal-access-token\">Asana API and Personal Access Token<\/h4>\n\n\n\n<p>The first thing we need to do is grab the API and an access token from your Asana account. Visit the<a href=\"https:\/\/asana.com\/developers\"> Asana Developer Console<\/a> to generate a new token. Save that token because we will need it for our connection to WordPress. The Asana API base URL is https:\/\/app.asana.com\/api\/1.0.<\/p>\n\n\n\n<p>To find your project ID, follow these steps:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open your Asana project in your web browser.<\/li>\n\n\n\n<li>Look at the URL, it will look something like: <a href=\"https:\/\/app.asana.com\/0\/1234567890123456\/board\">https:\/\/app.asana.com\/0\/1234567890123456\/board<\/a>.<\/li>\n\n\n\n<li>The Project ID is the long number after the \/0\/, in this example: 1234567890123456.<\/li>\n<\/ol>\n\n\n\n<p>Save these credentials. We will need them in the next section.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"configure-your-asana-credentials\">Configure Your Asana Credentials<\/h3>\n\n\n\n<p>Under the hood, this demo reads from WordPress options using <code>get_option()<\/code>. You can set these using WP-CLI.&nbsp; Make sure you are at the root of your WP install before setting these on your CLI:<\/p>\n\n\n<pre class=\"wp-block-code has-tiny-font-size\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>wp option update mpc_asana_access_token <span class=\"hljs-string\">\"YOUR_ASANA_PAT\"<\/span>\n<\/span><\/span><span class='shcb-loc'><span>wp option update mpc_asana_project_id <span class=\"hljs-string\">\"YOUR_PROJECT_GID\"<\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Once set, you should be able to confirm the options exist using <code>wp option get<\/code>. <\/p>\n\n\n\n<p>Now test it. Save or update a post, and tasks should appear in your Asana project within a few seconds.  The legal review custom checklist item when you check and uncheck should also reflect after you save it in Asana as well.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\" style=\"margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)\"><img loading=\"lazy\" decoding=\"async\" width=\"1920\" height=\"1080\" src=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/asana-newsroom-legalcheck.gif\" alt=\"\" class=\"wp-image-32076\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"class-asana-client-php-file\" style=\"margin-top:var(--wp--preset--spacing--50)\">The class-asana-client.php File<\/h2>\n\n\n\n<p>Now, let\u2019s dive into the code to show how this works. The first file we will go over is at <code>mediapress-simple\/inc\/class-asana-client.php<\/code>. The file is long so let&#8217;s break it down in chunks starting from the top.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\">\/**<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Asana API Client<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Handles communication with Asana API<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> *\/<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MPC_Asana_Client<\/span> <\/span>{<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Asana API base URL<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">const<\/span> API_BASE = <span class=\"hljs-string\">'https:\/\/app.asana.com\/api\/1.0'<\/span>;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Personal Access Token<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@var<\/span> string<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">private<\/span> $access_token;<\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This opening chunk sets up the client class and establishes two core pieces of state. <code>API_BASE<\/code> is the fixed root for every Asana REST call, so you only ever append endpoints like <code>\/tasks<\/code> to it. <code>$access_token<\/code> stores the Personal Access Token you\u2019ll use to authenticate every request via the <code>Authorization: Bearer \u2026 header<\/code>.<br><\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Constructor<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $access_token Asana Personal Access Token.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">( $access_token )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;access_token = $access_token;\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The constructor is intentionally minimal: it accepts your Asana token once and keeps it on the instance.&nbsp;<br><\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Create a task in Asana<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">create_task<\/span><span class=\"hljs-params\">( $project_id, $name, $notes = <span class=\"hljs-string\">''<\/span> )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t$data = <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-string\">'data'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'name'<\/span>     =&gt; $name,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'notes'<\/span>    =&gt; $notes,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'projects'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>( $project_id ),\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t),\n<\/span><\/span><span class='shcb-loc'><span>\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;request( <span class=\"hljs-string\">'POST'<\/span>, <span class=\"hljs-string\">'\/tasks'<\/span>, $data );\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><code>create_task() <\/code>is our operation for the demo: it builds the payload in the shape Asana expects <code>(data: { \u2026 })<\/code>, assigns the task to a project, and sends it to <code>POST \/tasks<\/code>.&nbsp;<\/p>\n\n\n\n<p>Everything funnels through <code>request()<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>\t<span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Update a task in Asana<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">update_task<\/span><span class=\"hljs-params\">( $task_id, $data )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t$payload = <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-string\">'data'<\/span> =&gt; $data,\n<\/span><\/span><span class='shcb-loc'><span>\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;request( <span class=\"hljs-string\">'PUT'<\/span>, <span class=\"hljs-string\">\"\/tasks\/{$task_id}\"<\/span>, $payload );\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><code>update_task()<\/code> is the generic \u201cchange anything\u201d method. You pass an array of fields you want to update (for example completed, notes, due_on, etc.), and it wraps that inside the required data envelope. This becomes the foundation for higher-level helpers like \u201ccomplete\u201d and \u201cincomplete.\u201d<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Mark a task as complete<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">complete_task<\/span><span class=\"hljs-params\">( $task_id )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;update_task( $task_id, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-string\">'completed'<\/span> =&gt; <span class=\"hljs-keyword\">true<\/span> ) );\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Mark a task as incomplete<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">incomplete_task<\/span><span class=\"hljs-params\">( $task_id )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;update_task( $task_id, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-string\">'completed'<\/span> =&gt; <span class=\"hljs-keyword\">false<\/span> ) );\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>These are methods for completion state that we centralize. This maps to a checklist workflow: a rule passing can \u201ccomplete\u201d a task, and a rule failing can \u201cre-open\u201d it.<br><\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Get a task from Asana<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">get_task<\/span><span class=\"hljs-params\">( $task_id )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;request( <span class=\"hljs-string\">'GET'<\/span>, <span class=\"hljs-string\">\"\/tasks\/{$task_id}\"<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Delete a task from Asana<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">delete_task<\/span><span class=\"hljs-params\">( $task_id )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;request( <span class=\"hljs-string\">'DELETE'<\/span>, <span class=\"hljs-string\">\"\/tasks\/{$task_id}\"<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>These are wrappers for reading and deleting tasks. We use them for debugging, verification, or cleanup.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"font-size:12px\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Make an API request to Asana<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">request<\/span><span class=\"hljs-params\">( $method, $endpoint, $data = array<span class=\"hljs-params\">()<\/span> )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t$url = <span class=\"hljs-keyword\">self<\/span>::API_BASE . $endpoint;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$args = <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-string\">'method'<\/span>  =&gt; $method,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-string\">'headers'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'Authorization'<\/span> =&gt; <span class=\"hljs-string\">'Bearer '<\/span> . <span class=\"hljs-keyword\">$this<\/span>-&gt;access_token,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'Content-Type'<\/span>  =&gt; <span class=\"hljs-string\">'application\/json'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'Accept'<\/span>        =&gt; <span class=\"hljs-string\">'application\/json'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t),\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-string\">'timeout'<\/span> =&gt; <span class=\"hljs-number\">30<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">empty<\/span>( $data ) &amp;&amp; in_array( $method, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-string\">'POST'<\/span>, <span class=\"hljs-string\">'PUT'<\/span> ), <span class=\"hljs-keyword\">true<\/span> ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$args&#91;<span class=\"hljs-string\">'body'<\/span>] = wp_json_encode( $data );\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$response = wp_remote_request( $url, $args );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This is the HTTP layer. It composes the request URL, attaches the authorization header, declares JSON input\/output, and uses WordPress\u2019s HTTP API (wp_remote_request) so it works across hosts and environments.<\/p>\n\n\n\n<p>It also only includes a JSON body when it is actually needed (POST\/PUT), which prevents accidental body payloads on GET requests.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-keyword\">if<\/span> ( is_wp_error( $response ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> $response;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$status_code = wp_remote_retrieve_response_code( $response );\n<\/span><\/span><span class='shcb-loc'><span>\t\t$body        = wp_remote_retrieve_body( $response );\n<\/span><\/span><span class='shcb-loc'><span>\t\t$headers     = wp_remote_retrieve_headers( $response );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Handle rate limiting (429)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-number\">429<\/span> === $status_code ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$retry_after = <span class=\"hljs-keyword\">isset<\/span>( $headers&#91;<span class=\"hljs-string\">'Retry-After'<\/span>] ) ? (int) $headers&#91;<span class=\"hljs-string\">'Retry-After'<\/span>] : <span class=\"hljs-number\">60<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> WP_Error(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'asana_rate_limit'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\tsprintf( <span class=\"hljs-string\">'Rate limit exceeded. Retry after %d seconds.'<\/span>, $retry_after ),\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-string\">'status'<\/span>      =&gt; $status_code,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-string\">'retry_after'<\/span> =&gt; $retry_after,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t)\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>We handle our transport failures and<a href=\"https:\/\/asana.com\/\"> Asana<\/a>\u00ae\u00b9 throttling in this file. If WordPress itself cannot make the request, you return the <code>WP_Error<\/code> as-is. If Asana responds with a 429, you read the Retry-After header (when available) and return a structured error that higher-level code can use to decide whether to retry later.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Decode JSON response<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$decoded = json_decode( $body, <span class=\"hljs-keyword\">true<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Handle non-JSON responses<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">null<\/span> === $decoded &amp;&amp; JSON_ERROR_NONE !== json_last_error() ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> WP_Error(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'asana_invalid_response'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'Invalid JSON response from Asana API'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-string\">'status'<\/span> =&gt; $status_code,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-string\">'body'<\/span>   =&gt; substr( $body, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">500<\/span> ),\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t)\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><br>This section protects you from unexpected responses. Asana should return JSON, but if anything upstream returns HTML, an empty body, or a proxy injects content, you will fail safely with a clear error. Trimming the body to the first 500 characters gives you enough to debug without dumping huge responses.<br><\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Handle error responses<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( $status_code &gt;= <span class=\"hljs-number\">400<\/span> ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$error_message = <span class=\"hljs-keyword\">isset<\/span>( $decoded&#91;<span class=\"hljs-string\">'errors'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'message'<\/span>] )\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t? $decoded&#91;<span class=\"hljs-string\">'errors'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'message'<\/span>]\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t: <span class=\"hljs-string\">'Unknown Asana API error'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> WP_Error(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-string\">'asana_api_error'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$error_message,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-string\">'status'<\/span> =&gt; $status_code,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-string\">'body'<\/span>   =&gt; $decoded,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t)\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> $decoded;\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, you normalize any Asana error (400+) into a <code>WP_Error<\/code> with the most helpful message available, plus the status code and decoded payload for debugging. If everything succeeds, you return the decoded JSON array, which keeps the rest of your integration code simple: it can just read <code>['data']['gid'] <\/code>or other Asana fields directly.<\/p>\n\n\n\n<details class=\"wp-block-details has-polar-background-color has-background is-layout-flow wp-block-details-is-layout-flow\" style=\"padding-top:12px;padding-right:12px;padding-bottom:12px;padding-left:12px\"><summary>You can view the code in it&#8217;s entirety here:<\/summary><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\">\/**<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Asana API Client<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Handles communication with Asana API<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> *\/<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MPC_Asana_Client<\/span> <\/span>{<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Asana API base URL<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">const<\/span> API_BASE = <span class=\"hljs-string\">'https:\/\/app.asana.com\/api\/1.0'<\/span>;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Personal Access Token<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@var<\/span> string<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">private<\/span> $access_token;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Constructor<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $access_token Asana Personal Access Token.<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">( $access_token )<\/span> <\/span>{<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;access_token = $access_token;<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Create a task in Asana<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $project_id Asana project ID.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $name Task name.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $notes Task description\/notes.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@return<\/span> array|WP_Error Task data or error.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">create_task<\/span><span class=\"hljs-params\">( $project_id, $name, $notes = <span class=\"hljs-string\">''<\/span> )<\/span> <\/span>{<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t$data = <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t<span class=\"hljs-string\">'data'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'name'<\/span>     =&gt; $name,<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'notes'<\/span>    =&gt; $notes,<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'projects'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>( $project_id ),<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t),<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t);<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;request( <span class=\"hljs-string\">'POST'<\/span>, <span class=\"hljs-string\">'\/tasks'<\/span>, $data );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-comment\">\t * Update a task in Asana<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $task_id Asana task ID.<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> array  $data Task data to update.<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@return<\/span> array|WP_Error Updated task data or error.<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">update_task<\/span><span class=\"hljs-params\">( $task_id, $data )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\">\t\t$payload = <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-string\">'data'<\/span> =&gt; $data,<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\">\t\t);<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;request( <span class=\"hljs-string\">'PUT'<\/span>, <span class=\"hljs-string\">\"\/tasks\/{$task_id}\"<\/span>, $payload );<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Mark a task as complete<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $task_id Asana task ID.<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@return<\/span> array|WP_Error Updated task data or error.<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">complete_task<\/span><span class=\"hljs-params\">( $task_id )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;update_task( $task_id, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-string\">'completed'<\/span> =&gt; <span class=\"hljs-keyword\">true<\/span> ) );<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Mark a task as incomplete<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $task_id Asana task ID.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@return<\/span> array|WP_Error Updated task data or error.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">incomplete_task<\/span><span class=\"hljs-params\">( $task_id )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;update_task( $task_id, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-string\">'completed'<\/span> =&gt; <span class=\"hljs-keyword\">false<\/span> ) );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Get a task from Asana<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $task_id Asana task ID.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@return<\/span> array|WP_Error Task data or error.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">get_task<\/span><span class=\"hljs-params\">( $task_id )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;request( <span class=\"hljs-string\">'GET'<\/span>, <span class=\"hljs-string\">\"\/tasks\/{$task_id}\"<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Delete a task from Asana<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $task_id Asana task ID.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@return<\/span> array|WP_Error Response or error.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">delete_task<\/span><span class=\"hljs-params\">( $task_id )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">$this<\/span>-&gt;request( <span class=\"hljs-string\">'DELETE'<\/span>, <span class=\"hljs-string\">\"\/tasks\/{$task_id}\"<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Make an API request to Asana<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $method HTTP method (GET, POST, PUT, DELETE).<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> string $endpoint API endpoint path.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> array  $data Request data.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@return<\/span> array|WP_Error Response data or error.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">request<\/span><span class=\"hljs-params\">( $method, $endpoint, $data = array<span class=\"hljs-params\">()<\/span> )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t$url = <span class=\"hljs-keyword\">self<\/span>::API_BASE . $endpoint;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t$args = <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t<span class=\"hljs-string\">'method'<\/span>  =&gt; $method,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t<span class=\"hljs-string\">'headers'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'Authorization'<\/span> =&gt; <span class=\"hljs-string\">'Bearer '<\/span> . <span class=\"hljs-keyword\">$this<\/span>-&gt;access_token,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'Content-Type'<\/span>  =&gt; <span class=\"hljs-string\">'application\/json'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'Accept'<\/span>        =&gt; <span class=\"hljs-string\">'application\/json'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t),<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t<span class=\"hljs-string\">'timeout'<\/span> =&gt; <span class=\"hljs-number\">30<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t);<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">empty<\/span>( $data ) &amp;&amp; in_array( $method, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-string\">'POST'<\/span>, <span class=\"hljs-string\">'PUT'<\/span> ), <span class=\"hljs-keyword\">true<\/span> ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t$args&#91;<span class=\"hljs-string\">'body'<\/span>] = wp_json_encode( $data );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t$response = wp_remote_request( $url, $args );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-keyword\">if<\/span> ( is_wp_error( $response ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t<span class=\"hljs-keyword\">return<\/span> $response;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t$status_code = wp_remote_retrieve_response_code( $response );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t$body        = wp_remote_retrieve_body( $response );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t$headers     = wp_remote_retrieve_headers( $response );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-comment\">\/\/ Handle rate limiting (429)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-number\">429<\/span> === $status_code ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t$retry_after = <span class=\"hljs-keyword\">isset<\/span>( $headers&#91;<span class=\"hljs-string\">'Retry-After'<\/span>] ) ? (int) $headers&#91;<span class=\"hljs-string\">'Retry-After'<\/span>] : <span class=\"hljs-number\">60<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> WP_Error(<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'asana_rate_limit'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\tsprintf( <span class=\"hljs-string\">'Rate limit exceeded. Retry after %d seconds.'<\/span>, $retry_after ),<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t\t<span class=\"hljs-string\">'status'<\/span>      =&gt; $status_code,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t\t<span class=\"hljs-string\">'retry_after'<\/span> =&gt; $retry_after,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t);<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-comment\">\/\/ Decode JSON response<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t$decoded = json_decode( $body, <span class=\"hljs-keyword\">true<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-comment\">\/\/ Handle non-JSON responses<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">null<\/span> === $decoded &amp;&amp; JSON_ERROR_NONE !== json_last_error() ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> WP_Error(<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'asana_invalid_response'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'Invalid JSON response from Asana API'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t\t<span class=\"hljs-string\">'status'<\/span> =&gt; $status_code,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t\t<span class=\"hljs-string\">'body'<\/span>   =&gt; substr( $body, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">500<\/span> ), <span class=\"hljs-comment\">\/\/ First 500 chars for debugging<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t);<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-comment\">\/\/ Handle error responses<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-keyword\">if<\/span> ( $status_code &gt;= <span class=\"hljs-number\">400<\/span> ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t$error_message = <span class=\"hljs-keyword\">isset<\/span>( $decoded&#91;<span class=\"hljs-string\">'errors'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'message'<\/span>] )<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t? $decoded&#91;<span class=\"hljs-string\">'errors'<\/span>]&#91;<span class=\"hljs-number\">0<\/span>]&#91;<span class=\"hljs-string\">'message'<\/span>]<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t: <span class=\"hljs-string\">'Unknown Asana API error'<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> WP_Error(<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-string\">'asana_api_error'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t$error_message,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t<span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t\t<span class=\"hljs-string\">'status'<\/span> =&gt; $status_code,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t\t<span class=\"hljs-string\">'body'<\/span>   =&gt; $decoded,<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t\t)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t\t);<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t\t<span class=\"hljs-keyword\">return<\/span> $decoded;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-params\">}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/details>\n\n\n\n<p><br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"class-asana-integration-php-file\">The class-asana-integration.php File<\/h2>\n\n\n\n<p>The second file that you need to add to your plugin to make this work is at <code>mediapress-simple\/inc\/class-asana-integration.php<\/code>.  <\/p>\n\n\n\n<p>Breaking the file down starting from the top:<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\">\/**<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Asana Integration<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Syncs MediaPress checklist items with Asana tasks (optimized)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> *\/<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MPC_Asana_Integration<\/span> <\/span>{<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Asana API client<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@var<\/span> MPC_Asana_Client<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">private<\/span> $client;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Asana Project ID<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@var<\/span> string<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">private<\/span> $project_id;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Constructor<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">()<\/span> <\/span>{<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Get settings<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t$access_token     = get_option( <span class=\"hljs-string\">'mpc_asana_access_token'<\/span>, <span class=\"hljs-string\">''<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;project_id = get_option( <span class=\"hljs-string\">'mpc_asana_project_id'<\/span>, <span class=\"hljs-string\">''<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Only initialize if credentials are set<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $access_token ) || <span class=\"hljs-keyword\">empty<\/span>( <span class=\"hljs-keyword\">$this<\/span>-&gt;project_id ) ) {<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Initialize Asana client<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;client = <span class=\"hljs-keyword\">new<\/span> MPC_Asana_Client( $access_token );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Hook into post save (canonical trigger - handles both block and classic editor)<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\tadd_action( <span class=\"hljs-string\">'save_post'<\/span>, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'schedule_sync'<\/span> ), <span class=\"hljs-number\">20<\/span>, <span class=\"hljs-number\">2<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Hook for background processing via WP-Cron<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\tadd_action( <span class=\"hljs-string\">'mpc_asana_background_sync'<\/span>, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'sync_checklist_to_asana'<\/span> ), <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">1<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>At the top of this file, we read the<a href=\"https:\/\/asana.com\/\"> Asana\u00ae\u00b9<\/a> credentials from WordPress\u00ae\u00b9 options, and bail early if they are not set, which keeps the plugin from doing work until it is properly configured.<\/p>\n\n\n\n<p>Once the token and project ID exist, we initialize our <code>MPC_Asana_Client<\/code> and hook into one canonical WordPress event <code>(save_post)<\/code> to detect when a post changes. From there, we have a background event <code>(mpc_asana_background_sync)<\/code> so we are not calling Asana during the editor save request.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Schedule async sync (debounced to prevent duplicates)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Uses WP-Cron for true non-blocking background processing<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">schedule_sync<\/span><span class=\"hljs-params\">( $post_id, $post )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Skip autosaves and revisions<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( defined( <span class=\"hljs-string\">'DOING_AUTOSAVE'<\/span> ) &amp;&amp; DOING_AUTOSAVE ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( wp_is_post_revision( $post_id ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Only process posts (can be expanded to other post types)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-string\">'post'<\/span> !== $post-&gt;post_type ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Debounce: Check if we already scheduled a sync for this post recently<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$transient_key = <span class=\"hljs-string\">'mpc_asana_sync_scheduled_'<\/span> . $post_id;\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( get_transient( $transient_key ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-comment\">\/\/ Already scheduled within last 5 seconds, skip<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Set transient to prevent duplicate scheduling (expires in 5 seconds)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\tset_transient( $transient_key, <span class=\"hljs-keyword\">true<\/span>, <span class=\"hljs-number\">5<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Schedule WP-Cron event for background processing (runs in ~5 seconds)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\twp_schedule_single_event( time() + <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-string\">'mpc_asana_background_sync'<\/span>, <span class=\"hljs-keyword\">array<\/span>( $post_id ) );\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This next code block prevents extra sync behavior by ignoring autosaves and revisions, and it scopes the integration to the post post type so you do not accidentally sync everything in the CMS.<\/p>\n\n\n\n<p>The transient acts as a debounce so we do not schedule five sync jobs when the block editor (Gutenberg) triggers multiple saves in quick succession. Finally, it schedules a single WP-Cron event to do the Asana work after the editor request finishes.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Sync checklist items to Asana (runs in background)<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">sync_checklist_to_asana<\/span><span class=\"hljs-params\">( $post_id )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Acquire sync lock to prevent concurrent syncs<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$lock_key = <span class=\"hljs-string\">'mpc_asana_sync_lock_'<\/span> . $post_id;\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( get_transient( $lock_key ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-comment\">\/\/ Another sync is already in progress, skip<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Set lock for 30 seconds<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\tset_transient( $lock_key, <span class=\"hljs-keyword\">true<\/span>, <span class=\"hljs-number\">30<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$post = get_post( $post_id );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( ! $post || <span class=\"hljs-string\">'post'<\/span> !== $post-&gt;post_type ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\tdelete_transient( $lock_key );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Get checklist configuration<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$checklist_items = <span class=\"hljs-keyword\">$this<\/span>-&gt;get_checklist_items( $post-&gt;post_type );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $checklist_items ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\tdelete_transient( $lock_key );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Get existing task mappings<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$task_mappings = get_post_meta( $post_id, <span class=\"hljs-string\">'_mpc_asana_task_mappings'<\/span>, <span class=\"hljs-keyword\">true<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( ! is_array( $task_mappings ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$task_mappings = <span class=\"hljs-keyword\">array<\/span>();\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Get previous validation states<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$previous_states = get_post_meta( $post_id, <span class=\"hljs-string\">'_mpc_asana_validation_states'<\/span>, <span class=\"hljs-keyword\">true<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( ! is_array( $previous_states ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$previous_states = <span class=\"hljs-keyword\">array<\/span>();\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$updated_states  = <span class=\"hljs-keyword\">array<\/span>();\n<\/span><\/span><span class='shcb-loc'><span>\t\t$tasks_to_update = <span class=\"hljs-keyword\">array<\/span>();\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This next block starts by making sure we do not run two syncs at the same time for the same post.<\/p>\n\n\n\n<p>The transient lock is the concurrency control and it prevents duplicate task creation under load. <\/p>\n\n\n\n<p>Next, we load the post, load the checklist rules for that post type, and then hydrate two pieces of state from post meta: (1) which checklist items already have Asana task IDs, and (2) what the last known validation result was for each item. <\/p>\n\n\n\n<p>That stored state is what allows you to be efficient and only touch Asana when something actually changed.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Process each checklist item<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">foreach<\/span> ( $checklist_items <span class=\"hljs-keyword\">as<\/span> $item ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-comment\">\/\/ Skip info items (items without validation checks)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'check'<\/span>] ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">continue<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$item_name = $item&#91;<span class=\"hljs-string\">'name'<\/span>];\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-comment\">\/\/ Check if we already have an Asana task for this item<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $task_mappings&#91; $item_name ] ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-comment\">\/\/ Create new task<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$task_id = <span class=\"hljs-keyword\">$this<\/span>-&gt;create_asana_task( $post_id, $post, $item );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( $task_id ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$task_mappings&#91; $item_name ] = $task_id;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-comment\">\/\/ New task, validate and update<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$is_valid                     = <span class=\"hljs-keyword\">$this<\/span>-&gt;validate_checklist_item( $post_id, $post, $item );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$updated_states&#91; $item_name ] = $is_valid;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$tasks_to_update&#91;]            = <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t\t<span class=\"hljs-string\">'task_id'<\/span>  =&gt; $task_id,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t\t<span class=\"hljs-string\">'is_valid'<\/span> =&gt; $is_valid,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t} <span class=\"hljs-keyword\">else<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-comment\">\/\/ Validate current state<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$is_valid                     = <span class=\"hljs-keyword\">$this<\/span>-&gt;validate_checklist_item( $post_id, $post, $item );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$updated_states&#91; $item_name ] = $is_valid;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-comment\">\/\/ Only update if state changed<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$previous_state = <span class=\"hljs-keyword\">isset<\/span>( $previous_states&#91; $item_name ] ) ? $previous_states&#91; $item_name ] : <span class=\"hljs-keyword\">null<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( $previous_state !== $is_valid ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$tasks_to_update&#91;] = <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t\t<span class=\"hljs-string\">'task_id'<\/span>  =&gt; $task_mappings&#91; $item_name ],\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t\t<span class=\"hljs-string\">'is_valid'<\/span> =&gt; $is_valid,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This loop is where the checklist focuses on tasks. We skip purely informational checklist entries (no check), because those are not really pass\/fail requirements. <\/p>\n\n\n\n<p>For each rule that can be validated, you either create the task once (if it does not exist yet) or re-check the rule and compare it to the last recorded state. The key optimization is that you only queue an Asana update when the rule flips from pass to fail or fail to pass, so you avoid hammering the API on every save.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Batch update only changed tasks<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">empty<\/span>( $tasks_to_update ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">foreach<\/span> ( $tasks_to_update <span class=\"hljs-keyword\">as<\/span> $task_update ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( $task_update&#91;<span class=\"hljs-string\">'is_valid'<\/span>] ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;client-&gt;complete_task( $task_update&#91;<span class=\"hljs-string\">'task_id'<\/span>] );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t} <span class=\"hljs-keyword\">else<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;client-&gt;incomplete_task( $task_update&#91;<span class=\"hljs-string\">'task_id'<\/span>] );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Save updated mappings and states<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\tupdate_post_meta( $post_id, <span class=\"hljs-string\">'_mpc_asana_task_mappings'<\/span>, $task_mappings );\n<\/span><\/span><span class='shcb-loc'><span>\t\tupdate_post_meta( $post_id, <span class=\"hljs-string\">'_mpc_asana_validation_states'<\/span>, $updated_states );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Release lock<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\tdelete_transient( $lock_key );\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This section of code applies changes to Asana and then persists the new truth back to WordPress. If a rule is valid, the matching task gets completed; if it becomes invalid again, the task is reopened. <\/p>\n\n\n\n<p>After that, you update the post meta mapping and the validation state cache so the next sync can be incremental rather than starting from scratch. Finally, you release the transient lock so future saves can trigger another sync.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Create an Asana task for a checklist item<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">create_asana_task<\/span><span class=\"hljs-params\">( $post_id, $post, $item )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Sanitize and truncate post title for Asana (max 1024 chars)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$post_title = $post-&gt;post_title ? wp_strip_all_tags( $post-&gt;post_title ) : <span class=\"hljs-string\">'Untitled Post'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t$post_title = mb_substr( $post_title, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">100<\/span> ); <span class=\"hljs-comment\">\/\/ Limit to 100 chars for task name<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Sanitize item title<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$item_title = <span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'title'<\/span>] ) ? wp_strip_all_tags( $item&#91;<span class=\"hljs-string\">'title'<\/span>] ) : <span class=\"hljs-string\">'Checklist Item'<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$task_name = sprintf(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-string\">'&#91;%s] %s'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$post_title,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$item_title\n<\/span><\/span><span class='shcb-loc'><span>\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Truncate full task name if too long (Asana limit is 1024)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$task_name = mb_substr( $task_name, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1000<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$task_notes = sprintf(\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-string\">\"Post: %s\\nPost ID: %d\\nChecklist Item: %s\\nType: %s\"<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\tget_permalink( $post_id ),\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$post_id,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'name'<\/span>] ) ? sanitize_text_field( $item&#91;<span class=\"hljs-string\">'name'<\/span>] ) : <span class=\"hljs-string\">''<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'type'<\/span>] ) ? sanitize_text_field( $item&#91;<span class=\"hljs-string\">'type'<\/span>] ) : <span class=\"hljs-string\">''<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t);\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$result = <span class=\"hljs-keyword\">$this<\/span>-&gt;client-&gt;create_task( <span class=\"hljs-keyword\">$this<\/span>-&gt;project_id, $task_name, $task_notes );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( is_wp_error( $result ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\terror_log( <span class=\"hljs-string\">'Asana task creation failed: '<\/span> . $result-&gt;get_error_message() );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">isset<\/span>( $result&#91;<span class=\"hljs-string\">'data'<\/span>]&#91;<span class=\"hljs-string\">'gid'<\/span>] ) ? $result&#91;<span class=\"hljs-string\">'data'<\/span>]&#91;<span class=\"hljs-string\">'gid'<\/span>] : <span class=\"hljs-keyword\">false<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This helper creates a task that is readable in Asana and safe to generate from WordPress content. We sanitize and truncate the post title so it does not pollute your task list with HTML or overly long names.<\/p>\n\n\n\n<p>The task name format (<code>[Post Title] Checklist Item<\/code>) makes it obvious what the task belongs to, and the notes include a direct permalink back to the WordPress post so editors can jump back to fix the issue quickly. If Asana rejects the request, you log the error and fail gracefully; otherwise you return the new task GID so it can be stored and reused.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Validate a checklist item against post data<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> int      $post_id Post ID.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> WP_Post $post Post object.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> array    $item Checklist item configuration.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@return<\/span> bool True if item passes validation, false otherwise.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">validate_checklist_item<\/span><span class=\"hljs-params\">( $post_id, $post, $item )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Item must have a check field (caller should verify this)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'check'<\/span>] ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$check      = $item&#91;<span class=\"hljs-string\">'check'<\/span>];\n<\/span><\/span><span class='shcb-loc'><span>\t\t$check_type = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'type'<\/span>] ) ? $check&#91;<span class=\"hljs-string\">'type'<\/span>] : <span class=\"hljs-string\">''<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t$source_key = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'sourceKey'<\/span>] ) ? $check&#91;<span class=\"hljs-string\">'sourceKey'<\/span>] : <span class=\"hljs-string\">''<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Get the value to check<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$value = <span class=\"hljs-keyword\">$this<\/span>-&gt;get_post_value( $post_id, $post, $source_key );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Perform validation based on check type<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">switch<\/span> ( $check_type ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'exists'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-comment\">\/\/ Handle checkbox arrays (like legal_review which saves as array)<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( is_array( $value ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-comment\">\/\/ For legal_review, check if 'completed' is in the array<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-string\">'meta.legal_review'<\/span> === $source_key ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> in_array( <span class=\"hljs-string\">'completed'<\/span>, $value, <span class=\"hljs-keyword\">true<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-comment\">\/\/ For other arrays, filter out empty strings and check if array has values<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$value = array_filter( $value );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $value );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-comment\">\/\/ For strings, empty string should fail<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( is_string( $value ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">''<\/span> !== trim( $value );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $value );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'min'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( is_string( $value ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$min = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'min'<\/span>] ) ? (int) $check&#91;<span class=\"hljs-string\">'min'<\/span>] : <span class=\"hljs-number\">0<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> strlen( $value ) &gt;= $min;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'max'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( is_string( $value ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$max = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'max'<\/span>] ) ? (int) $check&#91;<span class=\"hljs-string\">'max'<\/span>] : PHP_INT_MAX;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> strlen( $value ) &lt;= $max;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'range'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( is_string( $value ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$min    = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'min'<\/span>] ) ? (int) $check&#91;<span class=\"hljs-string\">'min'<\/span>] : <span class=\"hljs-number\">0<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$max    = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'max'<\/span>] ) ? (int) $check&#91;<span class=\"hljs-string\">'max'<\/span>] : PHP_INT_MAX;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t$length = strlen( $value );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> $length &gt;= $min &amp;&amp; $length &lt;= $max;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">default<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This function takes one checklist item definition and evaluates it against the current post data. The <code>sourceKey<\/code> tells you what to read (title, excerpt, meta fields, etc.), and <code>check.type<\/code> tells you how to validate it.<\/p>\n\n\n\n<p> The <code>exists<\/code> validation is set to handle checkbox arrays. For our <code>legal_review<\/code> field, it specifically checks if the array contains &#8216;completed&#8217;. This ensures the Publication Checklist accurately reflects the checkbox state in the WordPress dashboard and syncs properly with <a href=\"https:\/\/asana.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Asana\u00ae\u00b9<\/a>. For standard strings, it now ensures that a simple empty string or whitespace will fail the validation.<\/p>\n\n\n\n<p>Right now, we support the core operators used in our JSON (<code>exists<\/code>, <code>min<\/code>, <code>max<\/code>, and <code>range<\/code>), which covers the most common editorial checks like &#8220;required field&#8221; and &#8220;SEO length.&#8221; The output is a boolean that drives whether the Asana task should be open or completed.<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Get a value from post data using dot notation<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">get_post_value<\/span><span class=\"hljs-params\">( $post_id, $post, $source_key )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $source_key ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">null<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Handle meta fields<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( strpos( $source_key, <span class=\"hljs-string\">'meta.'<\/span> ) === <span class=\"hljs-number\">0<\/span> ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t$meta_key = substr( $source_key, <span class=\"hljs-number\">5<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> get_post_meta( $post_id, $meta_key, <span class=\"hljs-keyword\">true<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Handle post fields<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">switch<\/span> ( $source_key ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'title'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> $post-&gt;post_title;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'excerpt'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> $post-&gt;post_excerpt;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'content'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> $post-&gt;post_content;\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'categories'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$categories = get_the_category( $post_id );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $categories );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'tags'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$tags = get_the_tags( $post_id );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $tags );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'authors'<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-comment\">\/\/ Check for co-authors or author taxonomy<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$authors = get_the_terms( $post_id, <span class=\"hljs-string\">'authors'<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $authors ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-comment\">\/\/ Fallback to post author<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $post-&gt;post_author );\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $authors );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">default<\/span>:\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">null<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This block is the bridge between the checklist schema and WordPress. It supports dot notation for meta (<code>meta.some_key<\/code>) and maps source keys like <code>title, excerpt, categories, and authors<\/code> to the WordPress functions that can answer those questions. The key idea is that the checklist JSON stays declarative, while this function translates it into real WordPress data lookups.<br><\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t * Get checklist items from configuration<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\t *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">get_checklist_items<\/span><span class=\"hljs-params\">( $post_type )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Get config path from filter<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$config_path = apply_filters( <span class=\"hljs-string\">'mediapress_checklist_config_path'<\/span>, <span class=\"hljs-string\">''<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $config_path ) || ! file_exists( $config_path ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">array<\/span>();\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Read and parse config<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$config_content = file_get_contents( $config_path );\n<\/span><\/span><span class='shcb-loc'><span>\t\t$config         = json_decode( $config_content, <span class=\"hljs-keyword\">true<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $config&#91;<span class=\"hljs-string\">'items'<\/span>] ) || ! is_array( $config&#91;<span class=\"hljs-string\">'items'<\/span>] ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">array<\/span>();\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-comment\">\/\/ Filter items by post type<\/span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t$items = <span class=\"hljs-keyword\">array<\/span>();\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">foreach<\/span> ( $config&#91;<span class=\"hljs-string\">'items'<\/span>] <span class=\"hljs-keyword\">as<\/span> $item ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'postTypes'<\/span>] ) &amp;&amp; in_array( $post_type, $item&#91;<span class=\"hljs-string\">'postTypes'<\/span>], <span class=\"hljs-keyword\">true<\/span> ) ) {\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t\t$items&#91;] = $item;\n<\/span><\/span><span class='shcb-loc'><span>\t\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\t\t}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>\t\t<span class=\"hljs-keyword\">return<\/span> $items;\n<\/span><\/span><span class='shcb-loc'><span>\t}\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This final section loads the checklist rules straight from the MediaPress configuration file, using the <code>mediapress_checklist_config_path<\/code> filter to discover where that JSON lives. <\/p>\n\n\n\n<p>After decoding the file, it filters the items array down to just the rules that apply to the current post type, which keeps your integration flexible if you later want different checklists for different content types. The result is a clean list of rules the sync engine can evaluate and mirror into Asana.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<details class=\"wp-block-details has-polar-background-color has-background is-layout-flow wp-block-details-is-layout-flow\" style=\"padding-top:12px;padding-right:12px;padding-bottom:12px;padding-left:12px\"><summary>You can view the code in it&#8217;s entirety here:<\/summary><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\">\/**<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Asana Integration<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Syncs MediaPress checklist items with Asana tasks (optimized)<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> *\/<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MPC_Asana_Integration<\/span> <\/span>{<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Asana API client<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@var<\/span> MPC_Asana_Client<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">private<\/span> $client;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Asana Project ID<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@var<\/span> string<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">private<\/span> $project_id;<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t * Constructor<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">()<\/span> <\/span>{<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Get settings<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t$access_token     = get_option( <span class=\"hljs-string\">'mpc_asana_access_token'<\/span>, <span class=\"hljs-string\">''<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;project_id = get_option( <span class=\"hljs-string\">'mpc_asana_project_id'<\/span>, <span class=\"hljs-string\">''<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Only initialize if credentials are set<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $access_token ) || <span class=\"hljs-keyword\">empty<\/span>( <span class=\"hljs-keyword\">$this<\/span>-&gt;project_id ) ) {<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Initialize Asana client<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;client = <span class=\"hljs-keyword\">new<\/span> MPC_Asana_Client( $access_token );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Hook into post save (canonical trigger - handles both block and classic editor)<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\tadd_action( <span class=\"hljs-string\">'save_post'<\/span>, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'schedule_sync'<\/span> ), <span class=\"hljs-number\">20<\/span>, <span class=\"hljs-number\">2<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Hook for background processing via WP-Cron<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t\tadd_action( <span class=\"hljs-string\">'mpc_asana_background_sync'<\/span>, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'sync_checklist_to_asana'<\/span> ), <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">1<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Schedule async sync (debounced to prevent duplicates)<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Uses WP-Cron for true non-blocking background processing<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> int     $post_id Post ID.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> WP_Post $post Post object.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">schedule_sync<\/span><span class=\"hljs-params\">( $post_id, $post )<\/span> <\/span>{<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Skip autosaves and revisions<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( defined( <span class=\"hljs-string\">'DOING_AUTOSAVE'<\/span> ) &amp;&amp; DOING_AUTOSAVE ) {<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( wp_is_post_revision( $post_id ) ) {<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Only process posts (can be expanded to other post types)<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-string\">'post'<\/span> !== $post-&gt;post_type ) {<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Debounce: Check if we already scheduled a sync for this post recently<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$transient_key = <span class=\"hljs-string\">'mpc_asana_sync_scheduled_'<\/span> . $post_id;<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( get_transient( $transient_key ) ) {<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-comment\">\/\/ Already scheduled within last 5 seconds, skip<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Set transient to prevent duplicate scheduling (expires in 5 seconds)<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\tset_transient( $transient_key, <span class=\"hljs-keyword\">true<\/span>, <span class=\"hljs-number\">5<\/span> );<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Schedule WP-Cron event for background processing (runs in ~5 seconds)<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\twp_schedule_single_event( time() + <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-string\">'mpc_asana_background_sync'<\/span>, <span class=\"hljs-keyword\">array<\/span>( $post_id ) );<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Sync checklist items to Asana (runs in background)<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * <span class=\"hljs-doctag\">@param<\/span> int $post_id Post ID.<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">sync_checklist_to_asana<\/span><span class=\"hljs-params\">( $post_id )<\/span> <\/span>{<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Acquire sync lock to prevent concurrent syncs<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$lock_key = <span class=\"hljs-string\">'mpc_asana_sync_lock_'<\/span> . $post_id;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( get_transient( $lock_key ) ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-comment\">\/\/ Another sync is already in progress, skip<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Set lock for 30 seconds<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\tset_transient( $lock_key, <span class=\"hljs-keyword\">true<\/span>, <span class=\"hljs-number\">30<\/span> );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$post = get_post( $post_id );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( ! $post || <span class=\"hljs-string\">'post'<\/span> !== $post-&gt;post_type ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\tdelete_transient( $lock_key );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Get checklist configuration<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$checklist_items = <span class=\"hljs-keyword\">$this<\/span>-&gt;get_checklist_items( $post-&gt;post_type );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $checklist_items ) ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\tdelete_transient( $lock_key );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Get existing task mappings<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$task_mappings = get_post_meta( $post_id, <span class=\"hljs-string\">'_mpc_asana_task_mappings'<\/span>, <span class=\"hljs-keyword\">true<\/span> );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( ! is_array( $task_mappings ) ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t$task_mappings = <span class=\"hljs-keyword\">array<\/span>();<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Get previous validation states<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$previous_states = get_post_meta( $post_id, <span class=\"hljs-string\">'_mpc_asana_validation_states'<\/span>, <span class=\"hljs-keyword\">true<\/span> );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( ! is_array( $previous_states ) ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t$previous_states = <span class=\"hljs-keyword\">array<\/span>();<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$updated_states  = <span class=\"hljs-keyword\">array<\/span>();<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$tasks_to_update = <span class=\"hljs-keyword\">array<\/span>();<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Process each checklist item<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">foreach<\/span> ( $checklist_items <span class=\"hljs-keyword\">as<\/span> $item ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-comment\">\/\/ Skip info items (items without validation checks)<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'check'<\/span>] ) ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">continue<\/span>;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t$item_name = $item&#91;<span class=\"hljs-string\">'name'<\/span>];<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-comment\">\/\/ Check if we already have an Asana task for this item<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $task_mappings&#91; $item_name ] ) ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-comment\">\/\/ Create new task<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t$task_id = <span class=\"hljs-keyword\">$this<\/span>-&gt;create_asana_task( $post_id, $post, $item );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( $task_id ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$task_mappings&#91; $item_name ] = $task_id;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-comment\">\/\/ New task, validate and update<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$is_valid                    = <span class=\"hljs-keyword\">$this<\/span>-&gt;validate_checklist_item( $post_id, $post, $item );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$updated_states&#91; $item_name ] = $is_valid;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$tasks_to_update&#91;]            = <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\t<span class=\"hljs-string\">'task_id'<\/span>  =&gt; $task_id,<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\t<span class=\"hljs-string\">'is_valid'<\/span> =&gt; $is_valid,<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t);<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t} <span class=\"hljs-keyword\">else<\/span> {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-comment\">\/\/ Validate current state<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t$is_valid                     = <span class=\"hljs-keyword\">$this<\/span>-&gt;validate_checklist_item( $post_id, $post, $item );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t$updated_states&#91; $item_name ] = $is_valid;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-comment\">\/\/ Only update if state changed<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t$previous_state = <span class=\"hljs-keyword\">isset<\/span>( $previous_states&#91; $item_name ] ) ? $previous_states&#91; $item_name ] : <span class=\"hljs-keyword\">null<\/span>;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( $previous_state !== $is_valid ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$tasks_to_update&#91;] = <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\t<span class=\"hljs-string\">'task_id'<\/span>  =&gt; $task_mappings&#91; $item_name ],<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t\t<span class=\"hljs-string\">'is_valid'<\/span> =&gt; $is_valid,<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t);<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Batch update only changed tasks<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">empty<\/span>( $tasks_to_update ) ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">foreach<\/span> ( $tasks_to_update <span class=\"hljs-keyword\">as<\/span> $task_update ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( $task_update&#91;<span class=\"hljs-string\">'is_valid'<\/span>] ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;client-&gt;complete_task( $task_update&#91;<span class=\"hljs-string\">'task_id'<\/span>] );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t} <span class=\"hljs-keyword\">else<\/span> {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;client-&gt;incomplete_task( $task_update&#91;<span class=\"hljs-string\">'task_id'<\/span>] );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Save updated mappings and states<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\tupdate_post_meta( $post_id, <span class=\"hljs-string\">'_mpc_asana_task_mappings'<\/span>, $task_mappings );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\tupdate_post_meta( $post_id, <span class=\"hljs-string\">'_mpc_asana_validation_states'<\/span>, $updated_states );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Release lock<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\tdelete_transient( $lock_key );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Create an Asana task for a checklist item<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">create_asana_task<\/span><span class=\"hljs-params\">( $post_id, $post, $item )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Sanitize and truncate post title for Asana (max 1024 chars)<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$post_title = $post-&gt;post_title ? wp_strip_all_tags( $post-&gt;post_title ) : <span class=\"hljs-string\">'Untitled Post'<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$post_title = mb_substr( $post_title, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">100<\/span> ); <span class=\"hljs-comment\">\/\/ Limit to 100 chars for task name<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Sanitize item title<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$item_title = <span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'title'<\/span>] ) ? wp_strip_all_tags( $item&#91;<span class=\"hljs-string\">'title'<\/span>] ) : <span class=\"hljs-string\">'Checklist Item'<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$task_name = sprintf(<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-string\">'&#91;%s] %s'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t$post_title,<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t$item_title<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t);<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Truncate full task name if too long (Asana limit is 1024)<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$task_name = mb_substr( $task_name, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">1000<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$task_notes = sprintf(<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-string\">\"Post: %s\\nPost ID: %d\\nChecklist Item: %s\\nType: %s\"<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\tget_permalink( $post_id ),<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t$post_id,<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'name'<\/span>] ) ? sanitize_text_field( $item&#91;<span class=\"hljs-string\">'name'<\/span>] ) : <span class=\"hljs-string\">''<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'type'<\/span>] ) ? sanitize_text_field( $item&#91;<span class=\"hljs-string\">'type'<\/span>] ) : <span class=\"hljs-string\">''<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t);<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$result = <span class=\"hljs-keyword\">$this<\/span>-&gt;client-&gt;create_task( <span class=\"hljs-keyword\">$this<\/span>-&gt;project_id, $task_name, $task_notes );<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( is_wp_error( $result ) ) {<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\terror_log( <span class=\"hljs-string\">'Asana task creation failed: '<\/span> . $result-&gt;get_error_message() );<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">isset<\/span>( $result&#91;<span class=\"hljs-string\">'data'<\/span>]&#91;<span class=\"hljs-string\">'gid'<\/span>] ) ? $result&#91;<span class=\"hljs-string\">'data'<\/span>]&#91;<span class=\"hljs-string\">'gid'<\/span>] : <span class=\"hljs-keyword\">false<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Validate a checklist item against post data<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">validate_checklist_item<\/span><span class=\"hljs-params\">( $post_id, $post, $item )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Item must have a check field (caller should verify this)<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'check'<\/span>] ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$check      = $item&#91;<span class=\"hljs-string\">'check'<\/span>];<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$check_type = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'type'<\/span>] ) ? $check&#91;<span class=\"hljs-string\">'type'<\/span>] : <span class=\"hljs-string\">''<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$source_key = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'sourceKey'<\/span>] ) ? $check&#91;<span class=\"hljs-string\">'sourceKey'<\/span>] : <span class=\"hljs-string\">''<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Get the value to check<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$value = <span class=\"hljs-keyword\">$this<\/span>-&gt;get_post_value( $post_id, $post, $source_key );<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Perform validation based on check type<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">switch<\/span> ( $check_type ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'exists'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $value );<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'min'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( is_string( $value ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$min = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'min'<\/span>] ) ? (int) $check&#91;<span class=\"hljs-string\">'min'<\/span>] : <span class=\"hljs-number\">0<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> strlen( $value ) &gt;= $min;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'max'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( is_string( $value ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$max = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'max'<\/span>] ) ? (int) $check&#91;<span class=\"hljs-string\">'max'<\/span>] : PHP_INT_MAX;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> strlen( $value ) &lt;= $max;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'range'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( is_string( $value ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$min    = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'min'<\/span>] ) ? (int) $check&#91;<span class=\"hljs-string\">'min'<\/span>] : <span class=\"hljs-number\">0<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$max    = <span class=\"hljs-keyword\">isset<\/span>( $check&#91;<span class=\"hljs-string\">'max'<\/span>] ) ? (int) $check&#91;<span class=\"hljs-string\">'max'<\/span>] : PHP_INT_MAX;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t$length = strlen( $value );<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> $length &gt;= $min &amp;&amp; $length &lt;= $max;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">default<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Get a value from post data using dot notation<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">get_post_value<\/span><span class=\"hljs-params\">( $post_id, $post, $source_key )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $source_key ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">null<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Handle meta fields<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( strpos( $source_key, <span class=\"hljs-string\">'meta.'<\/span> ) === <span class=\"hljs-number\">0<\/span> ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t$meta_key = substr( $source_key, <span class=\"hljs-number\">5<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span> get_post_meta( $post_id, $meta_key, <span class=\"hljs-keyword\">true<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Handle post fields<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">switch<\/span> ( $source_key ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'title'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> $post-&gt;post_title;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'excerpt'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> $post-&gt;post_excerpt;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'content'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> $post-&gt;post_content;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'categories'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t$categories = get_the_category( $post_id );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $categories );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'tags'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t$tags = get_the_tags( $post_id );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $tags );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'authors'<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-comment\">\/\/ Check for co-authors or author taxonomy<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t$authors = get_the_terms( $post_id, <span class=\"hljs-string\">'authors'<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $authors ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-comment\">\/\/ Fallback to post author<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $post-&gt;post_author );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> ! <span class=\"hljs-keyword\">empty<\/span>( $authors );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">default<\/span>:<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">null<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t * Get checklist items from configuration<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">\t *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t<span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">get_checklist_items<\/span><span class=\"hljs-params\">( $post_type )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Get config path from filter<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$config_path = apply_filters( <span class=\"hljs-string\">'mediapress_checklist_config_path'<\/span>, <span class=\"hljs-string\">''<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">empty<\/span>( $config_path ) || ! file_exists( $config_path ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">array<\/span>();<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Read and parse config<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$config_content = file_get_contents( $config_path );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$config         = json_decode( $config_content, <span class=\"hljs-keyword\">true<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $config&#91;<span class=\"hljs-string\">'items'<\/span>] ) || ! is_array( $config&#91;<span class=\"hljs-string\">'items'<\/span>] ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">array<\/span>();<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-comment\">\/\/ Filter items by post type<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t$items = <span class=\"hljs-keyword\">array<\/span>();<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">foreach<\/span> ( $config&#91;<span class=\"hljs-string\">'items'<\/span>] <span class=\"hljs-keyword\">as<\/span> $item ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t<span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">isset<\/span>( $item&#91;<span class=\"hljs-string\">'postTypes'<\/span>] ) &amp;&amp; in_array( $post_type, $item&#91;<span class=\"hljs-string\">'postTypes'<\/span>], <span class=\"hljs-keyword\">true<\/span> ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t\t$items&#91;] = $item;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t\t<span class=\"hljs-keyword\">return<\/span> $items;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">\t}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/details>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"class-mpc-init-file\" style=\"margin-top:var(--wp--preset--spacing--50)\">The class-mpc-init.php file<\/h2>\n\n\n\n<p>To make our custom fields and checklist rules operational, we need to register them within the WordPress environment. The <code>MPC_Init<\/code> class handles the core registration and ensures our data remains clean during the save process.<\/p>\n\n\n\n<p>Go to <code>mediapress-simple\/inc\/class-mpc-init.php<\/code>. <\/p>\n\n\n\n<p>First, we add two actions to the constructor to connect our custom logic to the WordPress lifecycle:<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Register custom meta fields for REST API<\/span>\n<\/span><\/span><span class='shcb-loc'><span>add_action( <span class=\"hljs-string\">'init'<\/span>, &#91; $<span class=\"hljs-keyword\">this<\/span>, <span class=\"hljs-string\">'register_meta_fields'<\/span> ] );\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Handle checkbox save behavior via REST API<\/span>\n<\/span><\/span><span class='shcb-loc'><span>add_action( <span class=\"hljs-string\">'rest_after_insert_post'<\/span>, &#91; $<span class=\"hljs-keyword\">this<\/span>, <span class=\"hljs-string\">'handle_checkbox_cleanup'<\/span> ], <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">3<\/span> );\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>These hooks expose our fields to the REST API and provide a way to clean up checkbox values after a user saves a post.<\/p>\n\n\n\n<p>MediaPress uses React and the REST API for its editor interface. To make our <code>legal_review<\/code> field readable and writable in the block editor, we must register it:<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"> * Register custom meta fields for REST API access<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"> *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">register_meta_fields<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\">\/\/ Register legal_review meta field<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    register_post_meta(\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">'post'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-string\">'legal_review'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'type'<\/span>         =&gt; <span class=\"hljs-string\">'array'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'single'<\/span>       =&gt; <span class=\"hljs-keyword\">true<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>            <span class=\"hljs-string\">'show_in_rest'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>                <span class=\"hljs-string\">'schema'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>                    <span class=\"hljs-string\">'type'<\/span>  =&gt; <span class=\"hljs-string\">'array'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>                    <span class=\"hljs-string\">'items'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(\n<\/span><\/span><span class='shcb-loc'><span>                        <span class=\"hljs-string\">'type'<\/span> =&gt; <span class=\"hljs-string\">'string'<\/span>,\n<\/span><\/span><span class='shcb-loc'><span>                    ),\n<\/span><\/span><span class='shcb-loc'><span>                ),\n<\/span><\/span><span class='shcb-loc'><span>            ),\n<\/span><\/span><span class='shcb-loc'><span>        )\n<\/span><\/span><span class='shcb-loc'><span>    );\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>By registering this as an <code>array<\/code> type, we ensure the data format matches exactly what the checkbox component expects when it communicates with the database.<\/p>\n\n\n\n<p>Finally, we add a handler to manage the state of the checkbox. Because a checkbox can sometimes send unexpected data patterns when unchecked, this function ensures we only ever store a clean value:<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/**<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"> * Handle checkbox cleanup after REST API save<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"> *<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"> * <span class=\"hljs-doctag\">@param<\/span> WP_Post         $post Post object.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"> * <span class=\"hljs-doctag\">@param<\/span> WP_REST_Request $request Request object.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"> * <span class=\"hljs-doctag\">@param<\/span> bool            $creating True when creating, false when updating.<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-comment\"> *\/<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">handle_checkbox_cleanup<\/span><span class=\"hljs-params\">( $post, $request, $creating )<\/span> <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\">\/\/ Only process if we have meta data in the request<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $request&#91;<span class=\"hljs-string\">'meta'<\/span>] ) || ! <span class=\"hljs-keyword\">isset<\/span>( $request&#91;<span class=\"hljs-string\">'meta'<\/span>]&#91;<span class=\"hljs-string\">'legal_review'<\/span>] ) ) {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-keyword\">return<\/span>;\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    $value = $request&#91;<span class=\"hljs-string\">'meta'<\/span>]&#91;<span class=\"hljs-string\">'legal_review'<\/span>];\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-comment\">\/\/ Check if the value contains 'completed'<\/span>\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">if<\/span> ( is_array( $value ) &amp;&amp; in_array( <span class=\"hljs-string\">'completed'<\/span>, $value, <span class=\"hljs-keyword\">true<\/span> ) ) {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\">\/\/ Checkbox is checked - ensure clean array with only 'completed'<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        update_post_meta( $post-&gt;ID, <span class=\"hljs-string\">'legal_review'<\/span>, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-string\">'completed'<\/span> ) );\n<\/span><\/span><span class='shcb-loc'><span>    } <span class=\"hljs-keyword\">else<\/span> {\n<\/span><\/span><span class='shcb-loc'><span>        <span class=\"hljs-comment\">\/\/ Checkbox is unchecked or invalid - delete the meta<\/span>\n<\/span><\/span><span class='shcb-loc'><span>        delete_post_meta( $post-&gt;ID, <span class=\"hljs-string\">'legal_review'<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>    }\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This handler runs after every post save. It verifies if the &#8220;completed&#8221; value is present in the array. If it is, we save a clean version to the database. If it isn&#8217;t, we delete the meta entirely. This precision prevents invalid data states and ensures our Publication Checklist validation always has a reliable value to check against.<\/p>\n\n\n\n<details class=\"wp-block-details has-polar-background-color has-background is-layout-flow wp-block-details-is-layout-flow\" style=\"padding-top:12px;padding-right:12px;padding-bottom:12px;padding-left:12px\"><summary>You can view the code in it&#8217;s entirety here:<\/summary><pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\">\/**<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> * Class MPC_Init<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-comment\"> *\/<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MPC_Init<\/span> <\/span>{<\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">    <span class=\"hljs-comment\">\/**<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">     * Load fields config file for Meta panel &amp; Site settings<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">     * Load ruleset config file for Publication Checklist<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">     * Make sure the authors taxonomy is cloned in save without publish<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-comment\">     *\/<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\">    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">()<\/span> <\/span>{<\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Load fields config file for Meta panel &amp; Site settings<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        add_filter( <span class=\"hljs-string\">'mediapress_fields_config_path'<\/span>, &#91; <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'fields_config_path'<\/span> ] );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Load ruleset config file for Publication Checklist<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        add_filter( <span class=\"hljs-string\">'mediapress_checklist_config_path'<\/span>, &#91; <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'checklist_config_path'<\/span> ] );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Make sure the authors taxonomy is cloned in save without publish<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        add_filter( <span class=\"hljs-string\">'mediapress_workflow_taxonomies'<\/span>, &#91; <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'workflow_taxonomies'<\/span> ] );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Register custom meta fields for REST API<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        add_action( <span class=\"hljs-string\">'init'<\/span>, &#91; <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'register_meta_fields'<\/span> ] );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Handle checkbox save behavior via REST API<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">        add_action( <span class=\"hljs-string\">'rest_after_insert_post'<\/span>, &#91; <span class=\"hljs-keyword\">$this<\/span>, <span class=\"hljs-string\">'handle_checkbox_cleanup'<\/span> ], <span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">3<\/span> );<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">    }<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">    <span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * Filters the path to the fields config.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@param<\/span> string $path The path to the fields config.<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@return<\/span> string<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *\/<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\">    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">fields_config_path<\/span><span class=\"hljs-params\">( $path )<\/span> <\/span>{<\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">        $config_path = MPC_PLUGIN_DIR . <span class=\"hljs-string\">'\/config\/fields.json'<\/span>;<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">        $real_path   = realpath( $config_path );<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Validate path is within plugin config directory<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">false<\/span> === $real_path || strpos( $real_path, realpath( MPC_PLUGIN_DIR . <span class=\"hljs-string\">'\/config'<\/span> ) ) !== <span class=\"hljs-number\">0<\/span> ) {<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">''<\/span>;<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">        }<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-keyword\">return<\/span> $real_path;<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">    }<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">    <span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * Filters the path to the checklist config.<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@param<\/span> string $path The path to the checklist config.<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@return<\/span> string<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *\/<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\">    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">checklist_config_path<\/span><span class=\"hljs-params\">( $path )<\/span> <\/span>{<\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        $config_path = MPC_PLUGIN_DIR . <span class=\"hljs-string\">'\/config\/checklist.json'<\/span>;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        $real_path   = realpath( $config_path );<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Validate path is within plugin config directory<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-keyword\">if<\/span> ( <span class=\"hljs-keyword\">false<\/span> === $real_path || strpos( $real_path, realpath( MPC_PLUGIN_DIR . <span class=\"hljs-string\">'\/config'<\/span> ) ) !== <span class=\"hljs-number\">0<\/span> ) {<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">''<\/span>;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        }<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-keyword\">return<\/span> $real_path;<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    }<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    <span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * Filters the workflow taxonomy keys.<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@param<\/span> array&lt;string,string&gt; $taxonomies The workflow taxonomy slugs, keyed by REST field key.<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@return<\/span> array&lt;string,string&gt;<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *\/<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">workflow_taxonomies<\/span><span class=\"hljs-params\">( $taxonomies )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $taxonomies&#91;<span class=\"hljs-string\">'authors'<\/span>] ) ) {<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            $taxonomies&#91;<span class=\"hljs-string\">'authors'<\/span>] = <span class=\"hljs-string\">'authors'<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        }<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-keyword\">return<\/span> $taxonomies;<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    }<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    <span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * Register custom meta fields for REST API access<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">register_meta_fields<\/span><span class=\"hljs-params\">()<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Register legal_review meta field<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        register_post_meta(<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-string\">'post'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-string\">'legal_review'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                <span class=\"hljs-string\">'type'<\/span>         =&gt; <span class=\"hljs-string\">'array'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                <span class=\"hljs-string\">'single'<\/span>       =&gt; <span class=\"hljs-keyword\">true<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                <span class=\"hljs-string\">'show_in_rest'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                    <span class=\"hljs-string\">'schema'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                        <span class=\"hljs-string\">'type'<\/span>  =&gt; <span class=\"hljs-string\">'array'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                        <span class=\"hljs-string\">'items'<\/span> =&gt; <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                            <span class=\"hljs-string\">'type'<\/span> =&gt; <span class=\"hljs-string\">'string'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                        ),<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                    ),<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                ),<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            )<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        );<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Register primary_category meta field<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        register_post_meta(<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-string\">'post'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-string\">'primary_category'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-keyword\">array<\/span>(<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                <span class=\"hljs-string\">'type'<\/span>         =&gt; <span class=\"hljs-string\">'string'<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                <span class=\"hljs-string\">'single'<\/span>       =&gt; <span class=\"hljs-keyword\">true<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">                <span class=\"hljs-string\">'show_in_rest'<\/span> =&gt; <span class=\"hljs-keyword\">true<\/span>,<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            )<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        );<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    }<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    <span class=\"hljs-comment\">\/**<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * Handle checkbox cleanup after REST API save<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@param<\/span> WP_Post         $post Post object.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@param<\/span> WP_REST_Request $request Request object.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     * <span class=\"hljs-doctag\">@param<\/span> bool            $creating True when creating, false when updating.<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-comment\">     *\/<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">handle_checkbox_cleanup<\/span><span class=\"hljs-params\">( $post, $request, $creating )<\/span> <\/span>{<\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Only process if we have meta data in the request<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-keyword\">if<\/span> ( ! <span class=\"hljs-keyword\">isset<\/span>( $request&#91;<span class=\"hljs-string\">'meta'<\/span>] ) || ! <span class=\"hljs-keyword\">isset<\/span>( $request&#91;<span class=\"hljs-string\">'meta'<\/span>]&#91;<span class=\"hljs-string\">'legal_review'<\/span>] ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-keyword\">return<\/span>;<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        }<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        $value = $request&#91;<span class=\"hljs-string\">'meta'<\/span>]&#91;<span class=\"hljs-string\">'legal_review'<\/span>];<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-comment\">\/\/ Check if the value contains 'completed'<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        <span class=\"hljs-keyword\">if<\/span> ( is_array( $value ) &amp;&amp; in_array( <span class=\"hljs-string\">'completed'<\/span>, $value, <span class=\"hljs-keyword\">true<\/span> ) ) {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-comment\">\/\/ Checkbox is checked - ensure clean array with only 'completed'<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            update_post_meta( $post-&gt;ID, <span class=\"hljs-string\">'legal_review'<\/span>, <span class=\"hljs-keyword\">array<\/span>( <span class=\"hljs-string\">'completed'<\/span> ) );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        } <span class=\"hljs-keyword\">else<\/span> {<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            <span class=\"hljs-comment\">\/\/ Checkbox is unchecked or invalid - delete the meta<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">            delete_post_meta( $post-&gt;ID, <span class=\"hljs-string\">'legal_review'<\/span> );<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">        }<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">    }<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\">}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"php\"><span class=\"hljs-class\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><span class=\"hljs-function\"><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/details>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50)\">The plugin.php file<\/h2>\n\n\n\n<p>The final file we will go over is <code>plugin.php<\/code> file. <\/p>\n\n\n\n<p>Go to the root of your plugin and open <code>plugin.php<\/code>. Let&#8217;s look at the initialization logic.<\/p>\n\n\n\n<p>Rather than letting the plugin run immediately upon being seen by the server, we wrap the class instantiation in a specific WordPress hook:<\/p>\n\n\n<pre class=\"wp-block-code\" style=\"padding-right:10px;padding-left:10px;font-size:10px\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-code-table shcb-line-numbers\"><span class='shcb-loc'><span><span class=\"hljs-comment\">\/\/ Initialize classes on plugins_loaded hook<\/span>\n<\/span><\/span><span class='shcb-loc'><span>add_action( <span class=\"hljs-string\">'plugins_loaded'<\/span>, <span class=\"hljs-string\">'mpc_initialize_plugin'<\/span> );\n<\/span><\/span><span class='shcb-loc'><span>\n<\/span><\/span><span class='shcb-loc'><span><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">mpc_initialize_plugin<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">new<\/span> MPC_Init();\n<\/span><\/span><span class='shcb-loc'><span>    <span class=\"hljs-keyword\">new<\/span> MPC_Asana_Integration();\n<\/span><\/span><span class='shcb-loc'><span>}\n<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>By moving the initialization to the <code>plugins_loaded<\/code> hook, we ensure that WordPress core functions are fully available before our plugin attempts to use them. This is important for functions like <code>register_post_meta()<\/code>.<\/p>\n\n\n\n<p>This approach prevents fatal errors and ensures that the REST API registration happens exactly when it should.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--50)\">Conclusion<\/h2>\n\n\n\n<p>Building your editorial standards directly into the development workflow keeps quality consistent as you produce more content. Customizing the Newsroom Publication Checklist to communicate with the <a href=\"https:\/\/asana.com\/\">Asana\u00ae\u00b9<\/a> API connects your editors and project managers through one shared process.<\/p>\n\n\n\n<p>This setup cuts down on manual checks and gives your team a clear view of what tasks remain unfinished inside the WordPress\u00ae\u00b9 dashboard.&nbsp;  <\/p>\n\n\n\n<p>We\u2019d love to hear what you build with this\u2014drop into the Discord or Community Slack channel and share your projects or feedback.&nbsp; Happy Coding!<\/p>\n\n\n\n<p class=\"has-tiny-font-size\">[1] WP Engine is a proud member and supporter of the community of WordPress\u00ae users. The WordPress\u00ae trademark is the intellectual property of the WordPress Foundation. Uses of the WordPress\u00ae trademarks in this website are for identification purposes only and do not imply an endorsement by WordPress Foundation. WP Engine is not endorsed or owned by, or affiliated with, the WordPress Foundation.<br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the publisher workflow, checklists are important to ensure that you don\u2019t miss anything. Imagine how messy or unorganized things can get without checklists in your everyday life, let alone [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_EventAllDay":false,"_EventTimezone":"","_EventStartDate":"","_EventEndDate":"","_EventStartDateUTC":"","_EventEndDateUTC":"","_EventShowMap":false,"_EventShowMapLink":false,"_EventURL":"","_EventCost":"","_EventCostDescription":"","_EventCurrencySymbol":"","_EventCurrencyCode":"","_EventCurrencyPosition":"","_EventDateTimeSeparator":"","_EventTimeRangeSeparator":"","_EventOrganizerID":[],"_EventVenueID":[],"_OrganizerEmail":"","_OrganizerPhone":"","_OrganizerWebsite":"","_VenueAddress":"","_VenueCity":"","_VenueCountry":"","_VenueProvince":"","_VenueState":"","_VenueZip":"","_VenuePhone":"","_VenueURL":"","_VenueStateProvince":"","_VenueLat":"","_VenueLng":"","_VenueShowMap":false,"_VenueShowMapLink":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-32067","post","type-post","status-publish","format-standard","hentry","category-wordpress"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Customizing WP Engine\u2019s Newsroom Publication Checklist - Builders<\/title>\n<meta name=\"description\" content=\"Learn how to customize WP Engine\u2019s Newsroom publication checklist using JSON rules and automatically sync validation tasks to Asana for a connected editorial workflow.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Customizing WP Engine\u2019s Newsroom Publication Checklist\" \/>\n<meta property=\"og:description\" content=\"Learn how to customize WP Engine\u2019s Newsroom publication checklist using JSON rules and automatically sync validation tasks to Asana for a connected editorial workflow.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/\" \/>\n<meta property=\"og:site_name\" content=\"Builders\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-16T15:06:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-26T16:09:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/WPE-Builders-YouTube-ProductNavy-1920x1080-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Francis Agulto\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wpebuilders\" \/>\n<meta name=\"twitter:site\" content=\"@wpebuilders\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Francis Agulto\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/\"},\"author\":{\"name\":\"Francis Agulto\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/person\\\/bcdcb4ac0b215c34b6b30e440a24dc54\"},\"headline\":\"Customizing WP Engine\u2019s Newsroom Publication Checklist\",\"datePublished\":\"2026-02-16T15:06:07+00:00\",\"dateModified\":\"2026-02-26T16:09:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/\"},\"wordCount\":3140,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/image-679x1024.png\",\"articleSection\":[\"WordPress\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/\",\"name\":\"Customizing WP Engine\u2019s Newsroom Publication Checklist - Builders\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/image-679x1024.png\",\"datePublished\":\"2026-02-16T15:06:07+00:00\",\"dateModified\":\"2026-02-26T16:09:13+00:00\",\"description\":\"Learn how to customize WP Engine\u2019s Newsroom publication checklist using JSON rules and automatically sync validation tasks to Asana for a connected editorial workflow.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/#primaryimage\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/image.png\",\"contentUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/image.png\",\"width\":924,\"height\":1394},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/customizing-wp-engines-newsroom-publication-checklist\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Customizing WP Engine\u2019s Newsroom Publication Checklist\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#website\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\",\"name\":\"Builders\",\"description\":\"Reimagining the way we build with WordPress.\",\"publisher\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#organization\",\"name\":\"WP Engine\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/WP-Engine-Horizontal@2x.png\",\"contentUrl\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/wp-content\\\/uploads\\\/2024\\\/05\\\/WP-Engine-Horizontal@2x.png\",\"width\":348,\"height\":68,\"caption\":\"WP Engine\"},\"image\":{\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/wpebuilders\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCh1WuL54XFb9ZI6m6goFv1g\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/#\\\/schema\\\/person\\\/bcdcb4ac0b215c34b6b30e440a24dc54\",\"name\":\"Francis Agulto\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0c8a05c76944fc987d57296c96dc368055844527088c0aa44297edbfa8b82546?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0c8a05c76944fc987d57296c96dc368055844527088c0aa44297edbfa8b82546?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0c8a05c76944fc987d57296c96dc368055844527088c0aa44297edbfa8b82546?s=96&d=mm&r=g\",\"caption\":\"Francis Agulto\"},\"description\":\"Fran Agulto is a Developer Advocate at WP Engine. He is a lover of all things headless WordPress, Rock Climbing, and overall being stoked for people that love what they do and share that stoke with others! Follow me on Twitter for cool stoked headless WP!\",\"url\":\"https:\\\/\\\/wpengine.com\\\/builders\\\/author\\\/francis-agultowpengine-com-2-2-2-2-2-2-2-2-2-2-2-3\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Customizing WP Engine\u2019s Newsroom Publication Checklist - Builders","description":"Learn how to customize WP Engine\u2019s Newsroom publication checklist using JSON rules and automatically sync validation tasks to Asana for a connected editorial workflow.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/","og_locale":"en_US","og_type":"article","og_title":"Customizing WP Engine\u2019s Newsroom Publication Checklist","og_description":"Learn how to customize WP Engine\u2019s Newsroom publication checklist using JSON rules and automatically sync validation tasks to Asana for a connected editorial workflow.","og_url":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/","og_site_name":"Builders","article_published_time":"2026-02-16T15:06:07+00:00","article_modified_time":"2026-02-26T16:09:13+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/WPE-Builders-YouTube-ProductNavy-1920x1080-1.png","type":"image\/png"}],"author":"Francis Agulto","twitter_card":"summary_large_image","twitter_creator":"@wpebuilders","twitter_site":"@wpebuilders","twitter_misc":{"Written by":"Francis Agulto","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/#article","isPartOf":{"@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/"},"author":{"name":"Francis Agulto","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/person\/bcdcb4ac0b215c34b6b30e440a24dc54"},"headline":"Customizing WP Engine\u2019s Newsroom Publication Checklist","datePublished":"2026-02-16T15:06:07+00:00","dateModified":"2026-02-26T16:09:13+00:00","mainEntityOfPage":{"@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/"},"wordCount":3140,"commentCount":0,"publisher":{"@id":"https:\/\/wpengine.com\/builders\/#organization"},"image":{"@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/#primaryimage"},"thumbnailUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-679x1024.png","articleSection":["WordPress"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/","url":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/","name":"Customizing WP Engine\u2019s Newsroom Publication Checklist - Builders","isPartOf":{"@id":"https:\/\/wpengine.com\/builders\/#website"},"primaryImageOfPage":{"@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/#primaryimage"},"image":{"@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/#primaryimage"},"thumbnailUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image-679x1024.png","datePublished":"2026-02-16T15:06:07+00:00","dateModified":"2026-02-26T16:09:13+00:00","description":"Learn how to customize WP Engine\u2019s Newsroom publication checklist using JSON rules and automatically sync validation tasks to Asana for a connected editorial workflow.","breadcrumb":{"@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/#primaryimage","url":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image.png","contentUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2026\/02\/image.png","width":924,"height":1394},{"@type":"BreadcrumbList","@id":"https:\/\/wpengine.com\/builders\/customizing-wp-engines-newsroom-publication-checklist\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wpengine.com\/builders\/"},{"@type":"ListItem","position":2,"name":"Customizing WP Engine\u2019s Newsroom Publication Checklist"}]},{"@type":"WebSite","@id":"https:\/\/wpengine.com\/builders\/#website","url":"https:\/\/wpengine.com\/builders\/","name":"Builders","description":"Reimagining the way we build with WordPress.","publisher":{"@id":"https:\/\/wpengine.com\/builders\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wpengine.com\/builders\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/wpengine.com\/builders\/#organization","name":"WP Engine","url":"https:\/\/wpengine.com\/builders\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/logo\/image\/","url":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2024\/05\/WP-Engine-Horizontal@2x.png","contentUrl":"https:\/\/wpengine.com\/builders\/wp-content\/uploads\/2024\/05\/WP-Engine-Horizontal@2x.png","width":348,"height":68,"caption":"WP Engine"},"image":{"@id":"https:\/\/wpengine.com\/builders\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/wpebuilders","https:\/\/www.youtube.com\/channel\/UCh1WuL54XFb9ZI6m6goFv1g"]},{"@type":"Person","@id":"https:\/\/wpengine.com\/builders\/#\/schema\/person\/bcdcb4ac0b215c34b6b30e440a24dc54","name":"Francis Agulto","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/0c8a05c76944fc987d57296c96dc368055844527088c0aa44297edbfa8b82546?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0c8a05c76944fc987d57296c96dc368055844527088c0aa44297edbfa8b82546?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c8a05c76944fc987d57296c96dc368055844527088c0aa44297edbfa8b82546?s=96&d=mm&r=g","caption":"Francis Agulto"},"description":"Fran Agulto is a Developer Advocate at WP Engine. He is a lover of all things headless WordPress, Rock Climbing, and overall being stoked for people that love what they do and share that stoke with others! Follow me on Twitter for cool stoked headless WP!","url":"https:\/\/wpengine.com\/builders\/author\/francis-agultowpengine-com-2-2-2-2-2-2-2-2-2-2-2-3\/"}]}},"_links":{"self":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts\/32067","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/comments?post=32067"}],"version-history":[{"count":0,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/posts\/32067\/revisions"}],"wp:attachment":[{"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/media?parent=32067"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/categories?post=32067"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wpengine.com\/builders\/wp-json\/wp\/v2\/tags?post=32067"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}