[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f9UmzkF1ij7ZF-iO0DSVPcVoYr_YMby4CQKC3f6xu4BQ":3},{"slug":4,"display_name":5,"profile_url":6,"plugin_count":7,"total_installs":8,"avg_security_score":9,"avg_patch_time_days":10,"trust_score":11,"computed_at":12,"plugins":13},"attlii","Atte Liimatainen","https:\u002F\u002Fprofiles.wordpress.org\u002Fattlii\u002F",3,110,85,30,84,"2026-04-05T19:01:07.119Z",[14,33,53],{"slug":15,"name":16,"version":17,"author":5,"author_profile":6,"description":18,"short_description":19,"active_installs":20,"downloaded":21,"rating":20,"num_ratings":22,"last_updated":23,"tested_up_to":24,"requires_at_least":25,"requires_php":26,"tags":27,"homepage":28,"download_link":29,"security_score":9,"vuln_count":30,"unpatched_count":30,"last_vuln_date":31,"fetched_at":32},"image-blur","Image Blur","3.0.2","\u003Cp>Generates base64 encoded, downscaled and blurred versions of media library’s images, which can be used f.e. as a placeholder.\u003C\u002Fp>\n\u003Ch3>Inspiration\u003C\u002Fh3>\n\u003Cp>After Wolt showcased their \u003Ca href=\"https:\u002F\u002Fblurha.sh\u002F\" rel=\"nofollow ugc\">Blurhash\u003C\u002Fa> technique, I wanted to make something similar to WordPress. Instead of encoding images to base83 like the food delivery company does, I went with base64 so development experience was easier.\u003C\u002Fp>\n\u003Ch3>How to start using the plugin\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Install and activate this plugin in your environment\n\u003Cul>\n\u003Cli>The plugin should generate blurs for each image on the activation.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>Check an image’s details in your media library. It should have listing of all generated blurs.\u003C\u002Fli>\n\u003Cli>To get a blur to a template, use \u003Ccode>get_post_meta()\u003C\u002Fcode>. Check example theme in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FAttLii\u002Fimage-blur\" rel=\"nofollow ugc\">plugin’s repository\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Customization\u003C\u002Fh3>\n\u003Cp>The plugin provides few filters, so developers can modify generated blur images to their needs. By default, generated images are 8 pixels wide and passed once through gaussian blur function, which will result in roughly 250-1000 characters long string. To change these, use following hooks:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>function modify_image_blur_width( int $width ): int {\n  return 15;\n}\nadd_filter(\"image-blur-modify-width\", \"modify_image_blur_width\");\n\nfunction modify_gaussian_blur_strength( int $strength ): int {\n  return 10;\n}\nadd_filter(\"image-blur-modify-gaussian-blur-strength\", \"modify_gaussian_blur_strength\");\n\u003C\u002Fcode>\u003C\u002Fpre>\n","Generates base64 encoded, downscaled and blurred versions of media library's images, which can be used f.e. as a placeholder.",100,7307,1,"2024-01-15T18:23:00.000Z","","6.1.1","8.2",[],"https:\u002F\u002Fgithub.com\u002FAttLii\u002Fimage-blur","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fimage-blur.zip",0,null,"2026-03-15T15:16:48.613Z",{"slug":34,"name":35,"version":36,"author":5,"author_profile":6,"description":37,"short_description":38,"active_installs":39,"downloaded":40,"rating":30,"num_ratings":30,"last_updated":41,"tested_up_to":42,"requires_at_least":43,"requires_php":44,"tags":45,"homepage":24,"download_link":51,"security_score":9,"vuln_count":30,"unpatched_count":30,"last_vuln_date":31,"fetched_at":52},"arha-routes","Arha Routes","1.5","\u003Cp>WordPress plugin that helps to serve content through REST routes and gives\u003Cbr \u002F>\ncustomizability to developers through filters.\u003C\u002Fp>\n\u003Ch3>Available Routes\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Fpost\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Fpage\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Foptions\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Farchive\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Example queries\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Fpost?post_type=POST_TYPE&slug=SLUG\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Fpage?path=PATH\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Foptions\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Farchive?post_type=POST_TYPE&posts_per_page=POSTS_PER_PAGE&paged=PAGED&orderby=ORDERBY&order=ORDER\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>tax_query and meta_query in archive-route\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ccode>tax_query\u003C\u002Fcode> and \u003Ccode>meta_query\u003C\u002Fcode> are supported and they work how the query is built for it in \u003Ccode>new WP_Query()\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>both needs their values to bes passed in as stringified json\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Multiple post_types in archive-route\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>To pass multiple post_types in archive-route, use syntax that lets PHP read GET-param as an array. https:\u002F\u002Fstackoverflow.com\u002Fa\u002F9547490\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Filters\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\n\u003Cp>To exclude querying specific post types from \u003Ccode>post\u003C\u002Fcode>– and \u003Ccode>archive\u003C\u002Fcode>-routes, you\u003Cbr \u002F>\ncan use following filters:\u003C\u002Fp>\n\u003Cp>`\u003Cbr \u002F>\nadd_filter(‘arha_routes\u002Farchive_excluded_post_types’, ‘exclude_post_types’);\u003Cbr \u002F>\nadd_filter(‘arha_routes\u002Fpost_excluded_post_types’, ‘exclude_post_types’);\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>function exclude_post_types($excluded_post_types) {\u003Cbr \u002F>\n  $excluded_post_types = [‘post’];\u003Cbr \u002F>\n  return $excluded_post_types;\u003Cbr \u002F>\n}\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cul>\n\u003Cli>To format \u003Ccode>post\u003C\u002Fcode>-route’s post before it’s served to client, use \u003Ccode>arha_routes\u002Fformat_post\u003C\u002Fcode>-filter\u003Cbr \u002F>\n`\u003Cbr \u002F>\nadd_filter(‘arha_routes\u002Fformat_post’, ‘format_post’);\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>function format_post($post) {\u003Cbr \u002F>\n  return $post;\u003Cbr \u002F>\n}\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cul>\n\u003Cli>To format \u003Ccode>page\u003C\u002Fcode>-route’s post before it’s served to client, use \u003Ccode>arha_routes\u002Fformat_page\u003C\u002Fcode>-filter\u003Cbr \u002F>\n`\u003Cbr \u002F>\nadd_filter(‘arha_routes\u002Fformat_page’, ‘format_page’);\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>function format_page($page) {\u003Cbr \u002F>\n  return $page;\u003Cbr \u002F>\n}\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>To format \u003Ccode>archive\u003C\u002Fcode>-route’s posts before they are served to client, use \u003Ccode>arha_routes\u002Fformat_archive_post\u003C\u002Fcode>-filter\u003C\u002Fp>\n\u003Cp>\u003Ccode>add_filter('arha_routes\u002Fformat_archive_post', 'format_archive_post');\u003Cbr \u002F>\nfunction format_archive_post($post) {\u003Cbr \u002F>\nreturn $post;\u003Cbr \u002F>\n}\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>options\u003C\u002Fcode>-route returns empty result by default. To add content to it, use \u003Ccode>arha_routes\u002Fformat_options\u003C\u002Fcode>-filter\u003Cbr \u002F>\n`\u003Cbr \u002F>\nadd_filter(‘arha_routes\u002Fformat_options’, ‘format_options’);\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>function format_options($options) {\u003Cbr \u002F>\n  return $options;\u003Cbr \u002F>\n}\u003Cbr \u002F>\n    `\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>By default Arha Routes returns only published content with post-, page- and archive-route, this can be modified by adding following filters.\u003Cbr \u002F>\n`\u003Cbr \u002F>\n\u002F\u002F for archive route\u003Cbr \u002F>\nadd_filter(‘arha_routes\u002Fallowed_post_statuses_archive’, ‘allowed_post_statuses’);\u003Cbr \u002F>\n\u002F\u002F for post route\u003Cbr \u002F>\nadd_filter(‘arha_routes\u002Fallowed_post_statuses_post’, ‘allowed_post_statuses’);\u003Cbr \u002F>\n\u002F\u002F for page route\u003Cbr \u002F>\nadd_filter(‘arha_routes\u002Fallowed_post_statuses_page’, ‘allowed_post_statuses’);\u003Cbr \u002F>\nfunction allowed_post_statuses($post_statuses) {\u003Cbr \u002F>\n\u002F\u002F … change post_statuses array\u003C\u002Fp>\n\u003Cp>return $post_statuses;\u003Cbr \u002F>\n}\u003Cbr \u002F>\n`\u003Cbr \u002F>\nAfter adding setting up these filters, request can include “post_status” parameter and it will be compared to $post_statuses array.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>SearchWP\u003C\u002Fh3>\n\u003Cp>Arha Routes supports SearchWP-plugin, which lets WP users to make keyword search engine for their content.\u003C\u002Fp>\n\u003Cp>Activating SearchWP-plugin adds optional keyword-search functionality to \u003Ccode>archive\u003C\u002Fcode>-route. This is done by adding \u003Ccode>s=KEYWORD\u003C\u002Fcode> to the route\u003Cbr \u002F>\n– Example: \u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Farchive?post_type=products&posts_per_page=10&paged=1&orderby=date&order=ASC&s=monitor\u003C\u002Fcode>\u003C\u002Fp>\n\u003Ch3>Polylang\u003C\u002Fh3>\n\u003Cp>Arha Routes supports Polylang-plugin, which allows users to create content in multiple languages.\u003C\u002Fp>\n\u003Cp>Activating Polylang changes how endpoints work:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>All routes require additional \u003Ccode>lang\u003C\u002Fcode>-param\n\u003Cul>\n\u003Cli>Example: \u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Farchive?post_type=products&posts_per_page=10&paged=1&orderby=date&order=ASC&lang=en\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Ccode>page\u003C\u002Fcode>-route doesn’t support language prefix in path\n\u003Cul>\n\u003Cli>Example: Permalink \u003Ccode>\u002Fzh\u002Finfo\u003C\u002Fcode>, use like this \u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Fpage?path=\u002Finfo&lang=zh\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Example: Permalink \u003Ccode>\u002Fen\u002Finfo\u002Ftest\u003C\u002Fcode>, use like this \u003Ccode>\u002Fwp-json\u002Farha\u002Fv1\u002Fpage?path=\u002Finfo\u002Ftest&lang=zh\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Ccode>options\u003C\u002Fcode>-route passes \u003Ccode>lang\u003C\u002Fcode>-param forward to \u003Ccode>arha_routes\u002Fformat_options\u003C\u002Fcode>-filter\u003Cbr \u002F>\n\u003Ccode>add_filter('arha_routes\u002Fformat_options', 'format_options', 10, 2);\u003Cbr \u002F>\nfunction format_options($options, $lang) {\u003Cbr \u002F>\nreturn $options;\u003Cbr \u002F>\n}\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Polylang + SearchWP\u003C\u002Fh3>\n\u003Cp>In order to make these two plugins work together, you need to add extra plugin to WP installation.\u003C\u002Fp>\n\u003Cp>https:\u002F\u002Fsearchwp.com\u002Fextensions\u002Fpolylang-integration\u002F\u003C\u002Fp>\n","Wordpress plugin that helps to serve content through REST routes and gives customizability to developers through filters.",10,1338,"2020-05-15T06:18:00.000Z","5.3.21","5.0","7.1",[46,47,48,49,50],"bilingual","endpoint","language","multilingual","rest","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Farha-routes.zip","2026-03-15T14:54:45.397Z",{"slug":54,"name":55,"version":56,"author":5,"author_profile":6,"description":57,"short_description":58,"active_installs":30,"downloaded":59,"rating":30,"num_ratings":30,"last_updated":60,"tested_up_to":61,"requires_at_least":62,"requires_php":63,"tags":64,"homepage":68,"download_link":69,"security_score":9,"vuln_count":30,"unpatched_count":30,"last_vuln_date":31,"fetched_at":32},"headless-converter","Headless Converter","1.0.6","\u003Cp>Converts frontend to JSON response when request is done with certain conditions.\u003C\u002Fp>\n\u003Ch3>Inspiration\u003C\u002Fh3>\n\u003Cp>After creating a bunch of headless WordPress + Web app stacks, I wanted to find a standard and a all-round solution for fetching per page information for web applications inside WordPress. Built-in rest api works fine in basic cases, but it doesn’t support querying by path. Usually this meant that for each project developers would create a custom rest endpoint which would return expected content using content type and slug parameters.\u003C\u002Fp>\n\u003Cp>WordPress has few built-in functions to retrieve content by path, \u003Ca href=\"https:\u002F\u002Fdeveloper.wordpress.org\u002Freference\u002Ffunctions\u002Furl_to_postid\u002F\" rel=\"nofollow ugc\">url_to_postid\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fdeveloper.wordpress.org\u002Freference\u002Ffunctions\u002Fget_page_by_path\u002F\" rel=\"nofollow ugc\">get_page_by_path\u003C\u002Fa>, but they don’t seem to work with multilanguage plugins, taxonomy or archive pages, which means that WP doesn’t have a reliable way to fetch content this way through rest api.\u003C\u002Fp>\n\u003Cp>This plugin converts frontend to JSON which seems after above solution the best way to do things, with added layer of security through application passwords (WordPress v5.6 feature) and a filter, which let’s developers alter outgoing data.\u003C\u002Fp>\n\u003Ch3>How to start using the plugin\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Install and activate this plugin in your environment\u003C\u002Fli>\n\u003Cli>Create application password for a user with administrator role\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>After above steps have been made, make a request to a page with added \u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBasic_access_authentication#Client_side\" rel=\"nofollow ugc\">Authorization header\u003C\u002Fa>. See data fetching examples at the end of this documentation for more help\u003C\u002Fp>\n\u003Ch3>Modifying the output\u003C\u002Fh3>\n\u003Cp>Plugin outputs current page’s Post object or null. This can be modified using \u003Ccode>headless-converter-modify-data\u003C\u002Fcode>-filter. You can either modify passed in post object or do your own logic like in the example below.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F**\n * Modifies Headless Converter plugin's output.\n * \n * @param WPPost|null $post - Current template's post object \n *\u002F\nfunction modify_headless_converter_output($post) {\n  if(is_404()) {\n    return \"this block renders 404 page content\";\n  } else if(is_page()) {\n    return \"this block renders page post types content\";\n  } else if (is_singular('post')) {\n    return \"this block renders single post content\";\n  } else if(is_home()) {\n    return \"this block renders post archive\";\n  } else {\n    return $post;\n  }\n}\n\nadd_filter('headless-converter-modify-data', 'modify_headless_converter_output');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Data fetching examples\u003C\u002Fh3>\n\u003Ch4>Fetch\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>const username = \"admin\"\nconst password = \"1111 1111 1111 1111 1111\"\nconst url = \"http:\u002F\u002Flocalhost:3000\u002F?page_id=2\"\nconst opts = {\n  headers: {\n     'Authorization': 'Basic ' + btoa(username + \":\" + password) \n  }, \n}\nfetch(url, opts).then(r => r.json()).then(console.log)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Axios\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>const axios = require(\"axios\")\n\nconst username = \"admin\"\nconst password = \"1111 1111 1111 1111 1111\"\nconst url = \"http:\u002F\u002Flocalhost:3000\u002F?page_id=2\"\nconst opts = {\n  auth: {\n    username,\n    password\n  }\n}\n\naxios(url, opts).then(r => r.data).then(console.log)\n\u003C\u002Fcode>\u003C\u002Fpre>\n","Converts frontend to JSON response when request is done with certain conditions.",2653,"2022-01-28T19:15:00.000Z","5.9.13","5.6","7.4",[65,66,67],"converter","headless","json","https:\u002F\u002Fgithub.com\u002FAttLii\u002Fheadless-converter","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fheadless-converter.1.0.6.zip"]