[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fhZ5l4aRS0CCm1QUfl9HZBUknOTzhMjp7MpPMuMMEXsc":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},"jbrinley","Jonathan Brinley","https:\u002F\u002Fprofiles.wordpress.org\u002Fjbrinley\u002F",6,1170,84,1,89,"2026-04-04T16:08:51.326Z",[14,37,53,74,92,108],{"slug":15,"name":16,"version":17,"author":5,"author_profile":6,"description":18,"short_description":19,"active_installs":20,"downloaded":21,"rating":22,"num_ratings":23,"last_updated":24,"tested_up_to":25,"requires_at_least":26,"requires_php":27,"tags":28,"homepage":31,"download_link":32,"security_score":33,"vuln_count":34,"unpatched_count":34,"last_vuln_date":35,"fetched_at":36},"wp-router","WP Router","0.5","\u003Cp>WordPress’s rewrite rules and query variables provide a powerful system\u003Cbr \u002F>\nfor mapping URL strings to collections of posts. Every request is parsed\u003Cbr \u002F>\ninto query variables and turned into a SQL query via \u003Ccode>$wp_query->query()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Sometimes, though, you don’t want to display a list of posts. You just want\u003Cbr \u002F>\na URL to map to a callback function, with the output displayed in place of\u003Cbr \u002F>\nposts in whatever theme you happen to be using.\u003C\u002Fp>\n\u003Cp>That’s where WP Router comes in. It handles all the messy bits of registering\u003Cbr \u002F>\npost types, query variables, rewrite rules, etc., and lets you write code to\u003Cbr \u002F>\ndo what you want it to do. One function call is all it takes to map a\u003Cbr \u002F>\nURL to your designated callback function and display the return value in the page.\u003C\u002Fp>\n\u003Cp>Created by \u003Ca href=\"http:\u002F\u002Fflightless.us\" rel=\"nofollow ugc\">Flightless\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>Usage\u003C\u002Fh3>\n\u003Ch4>Creating Routes\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Your plugin should hook into the \u003Ccode>wp_router_generate_routes\u003C\u002Fcode> action.\u003Cbr \u002F>\nThe callback should take one argument, a \u003Ccode>WP_Router\u003C\u002Fcode> object.\u003C\u002Fli>\n\u003Cli>\n\u003Cp>Register a route and its callback using \u003Ccode>WP_Router::add_route( $id, $args )\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>$id\u003C\u002Fcode> is a unique string your plugin should use to identify the route\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>$args\u003C\u002Fcode> is an associative array, that sets the following properties for your route.\u003Cbr \u002F>\nAny omitted argument will use the default value.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>path\u003C\u002Fcode> (required) – A regular expression to match against the request path.\u003Cbr \u002F>\nThis corresponds to the array key you would use when creating rewrite rules for WordPress.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>query_vars\u003C\u002Fcode> – An associative array, with the keys being query vars, and the\u003Cbr \u002F>\nvalues being explicit strings or integers corresponding to matches in the path regexp.\u003Cbr \u002F>\n Any query variables included here will be automatically registered.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>title\u003C\u002Fcode> – The title of the page.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>title_callback\u003C\u002Fcode> – A callback to use for dynamically generating the title.\u003Cbr \u002F>\nDefaults to \u003Ccode>__()\u003C\u002Fcode>. If \u003Ccode>NULL\u003C\u002Fcode>, the \u003Ccode>title\u003C\u002Fcode> argument will be used as-is. if\u003Cbr \u002F>\n    page_callback or \u003Ccode>access_callback\u003C\u002Fcode> returns \u003Ccode>FALSE\u003C\u002Fcode>, \u003Ccode>title_callback\u003C\u002Fcode> will not be called.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>title_callback can be either a single callback function or an array specifying\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>callback functions for specific HTTP methods (e.g., \u003Ccode>GET\u003C\u002Fcode>, \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>DELETE\u003C\u002Fcode>, etc.).\u003Cbr \u002F>\nIf the latter, the \u003Ccode>default\u003C\u002Fcode> key will be used if no other keys match the current\u003Cbr \u002F>\nrequest method.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>title_arguments\u003C\u002Fcode> – An array of query variables whose values will be passed\u003Cbr \u002F>\nas arguments to \u003Ccode>title_callback\u003C\u002Fcode>. Defaults to the value of \u003Ccode>title\u003C\u002Fcode>. If an argument\u003Cbr \u002F>\nis not a registered query variable, it will be passed as-is.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>page_callback\u003C\u002Fcode> (required) – A callback to use for dynamically generating the\u003Cbr \u002F>\ncontents of the page. The callback should either echo or return the contents of\u003Cbr \u002F>\nthe page (if both, the returned value will be appended to the echoed value). If\u003Cbr \u002F>\n    FALSE is returned, nothing will be output, and control of the page contents will\u003Cbr \u002F>\nbe handed back to WordPress. The callback will be called during the \u003Ccode>parse_request\u003C\u002Fcode>\u003Cbr \u002F>\nphase of WordPress’s page load. If \u003Ccode>access_callback\u003C\u002Fcode> returns \u003Ccode>FALSE\u003C\u002Fcode>, \u003Ccode>page_callback\u003C\u002Fcode>\u003Cbr \u002F>\nwill not be called.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>page_callback can be either a single callback function or an array specifying\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>callback functions for specific HTTP methods (e.g., \u003Ccode>GET\u003C\u002Fcode>, \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>DELETE\u003C\u002Fcode>, etc.).\u003Cbr \u002F>\nIf the latter, the \u003Ccode>default\u003C\u002Fcode> key will be used if no other keys match the current\u003Cbr \u002F>\nrequest method.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>page_arguments\u003C\u002Fcode> – An array of query variables whose values will be passed as\u003Cbr \u002F>\narguments to \u003Ccode>page_callback\u003C\u002Fcode>. If an argument is not a registered query variable,\u003Cbr \u002F>\nit will be passed as-is.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>access_callback\u003C\u002Fcode> – A callback to determine if the user has permission to access\u003Cbr \u002F>\nthis page. If \u003Ccode>access_arguments\u003C\u002Fcode> is provided, default is \u003Ccode>current_user_can\u003C\u002Fcode>, otherwise\u003Cbr \u002F>\ndefault is \u003Ccode>TRUE\u003C\u002Fcode>. If the callback returns \u003Ccode>FALSE\u003C\u002Fcode>, anonymous users are redirected to\u003Cbr \u002F>\nthe login page, authenticated users get a 403 error.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>access_callback can be either a single callback function or an array specifying\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>callback functions for specific HTTP methods (e.g., \u003Ccode>GET\u003C\u002Fcode>, \u003Ccode>POST\u003C\u002Fcode>, \u003Ccode>PUT\u003C\u002Fcode>, \u003Ccode>DELETE\u003C\u002Fcode>, etc.).\u003Cbr \u002F>\nIf the latter, the \u003Ccode>default\u003C\u002Fcode> key will be used if no other keys match the current\u003Cbr \u002F>\nrequest method.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>access_arguments\u003C\u002Fcode> – An array of query variables whose values will be passed\u003Cbr \u002F>\nas arguments to \u003Ccode>access_callback\u003C\u002Fcode>. If an argument is not a registered query variable,\u003Cbr \u002F>\nit will be passed as-is.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>template\u003C\u002Fcode> – An array of templates that can be used to display the page. If a path\u003Cbr \u002F>\nis absolute, it will be used as-is; relative paths allow for overrides by the theme.\u003Cbr \u002F>\nThe string \u003Ccode>$id\u003C\u002Fcode> will be replaced with the ID of the route. If no template is found,\u003Cbr \u002F>\nfallback templates are (in this order): \u003Ccode>route-$id.php\u003C\u002Fcode>, \u003Ccode>route.php\u003C\u002Fcode>, \u003Ccode>page-$id.php\u003C\u002Fcode>,\u003Cbr \u002F>\n    page.php, \u003Ccode>index.php\u003C\u002Fcode>. If FALSE is given instead of an array, the page contents will\u003Cbr \u002F>\nbe printed before calling \u003Ccode>exit()\u003C\u002Fcode> (you can also accomplish this by printing your output\u003Cbr \u002F>\nand exiting directly from your callback function).\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Example:\u003Cbr \u002F>\n    $router->add_route(‘wp-router-sample’, array(\u003Cbr \u002F>\n        ‘path’ => ‘^wp_router\u002F(.*?)$’,\u003Cbr \u002F>\n        ‘query_vars’ => array(\u003Cbr \u002F>\n            ‘sample_argument’ => 1,\u003Cbr \u002F>\n        ),\u003Cbr \u002F>\n        ‘page_callback’ => array(get_class(), ‘sample_callback’),\u003Cbr \u002F>\n        ‘page_arguments’ => array(‘sample_argument’),\u003Cbr \u002F>\n        ‘access_callback’ => TRUE,\u003Cbr \u002F>\n        ‘title’ => ‘WP Router Sample Page’,\u003Cbr \u002F>\n        ‘template’ => array(‘sample-page.php’, dirname(\u003Cstrong>FILE\u003C\u002Fstrong>).DIRECTORY_SEPARATOR.’sample-page.php’)\u003Cbr \u002F>\n    ));\u003C\u002Fp>\n\u003Cp>In this example, the path \u003Ccode>http:\u002F\u002Fexample.com\u002Fwp_router\u002Fmy_sample_path\u002F\u003C\u002Fcode> will call\u003Cbr \u002F>\nthe function \u003Ccode>sample_callback\u003C\u002Fcode> in the calling class. The value of the \u003Ccode>sample_argument\u003C\u002Fcode>\u003Cbr \u002F>\nquery variable, in this case “my_sample_path”, will be provided as the first and only\u003Cbr \u002F>\nargument to the callback function. If the file \u003Ccode>sample-page.php\u003C\u002Fcode> is found in the theme,\u003Cbr \u002F>\nit will be used as the template, otherwise \u003Ccode>sample-page.php\u003C\u002Fcode> in your plugin directory will\u003Cbr \u002F>\nbe used (if that’s not found either, fall back to \u003Ccode>route-wp-router-sample.php\u003C\u002Fcode>, etc.).\u003C\u002Fp>\n\u003Ch4>Editing Routes\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>You can hook into the \u003Ccode>wp_router_alter_routes\u003C\u002Fcode> action to modify routes created by other plugins. The callback should take one argument, a \u003Ccode>WP_Router\u003C\u002Fcode> object.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Public API Functions\u003C\u002Fh4>\n\u003Cp>Creating or changing routes should always occur in the context of the \u003Ccode>wp_router_generate_routes\u003C\u002Fcode> or \u003Ccode>wp_router_alter_routes\u003C\u002Fcode> actions, using the \u003Ccode>WP_Router\u003C\u002Fcode> object supplied to your callback function.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>WP_Router::edit_route( string $id, array $changes )\u003C\u002Fcode> – update each\u003Cbr \u002F>\nproperty given in \u003Ccode>$changes\u003C\u002Fcode> for the route with the given ID. Any properties\u003Cbr \u002F>\nnot given in \u003Ccode>$changes\u003C\u002Fcode> will be left unaltered.\u003C\u002Fli>\n\u003Cli>\u003Ccode>WP_Router::remove_route( string $id )\u003C\u002Fcode> – delete the route with the given ID\u003C\u002Fli>\n\u003Cli>\u003Ccode>WP_Router::get_route( string $id )\u003C\u002Fcode> – get the \u003Ccode>WP_Route\u003C\u002Fcode> object for the given ID\u003C\u002Fli>\n\u003Cli>\u003Ccode>WP_Router::get_url( string $id, array $arguments )\u003C\u002Fcode> – get the URL to reach the route with the given ID, with the given query variables and their values\u003C\u002Fli>\n\u003Cli>\u003Ccode>WP_Route::get( string $property )\u003C\u002Fcode> – get the value of the specified property for\u003Cbr \u002F>\nthe \u003Ccode>WP_Route\u003C\u002Fcode> instance\u003C\u002Fli>\n\u003C\u002Ful>\n","Provides a simple API for mapping requests to callback functions.",1000,16922,74,3,"2012-08-06T15:06:00.000Z","3.4.2","3.0","",[29,30],"callback-functions","url-mapping","https:\u002F\u002Fgithub.com\u002Fjbrinley\u002FWP-Router","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fwp-router.zip",85,0,null,"2026-03-15T15:16:48.613Z",{"slug":38,"name":39,"version":40,"author":5,"author_profile":6,"description":41,"short_description":42,"active_installs":43,"downloaded":44,"rating":43,"num_ratings":10,"last_updated":45,"tested_up_to":46,"requires_at_least":26,"requires_php":27,"tags":47,"homepage":51,"download_link":52,"security_score":33,"vuln_count":34,"unpatched_count":34,"last_vuln_date":35,"fetched_at":36},"page-excerpts","Page Excerpts","1.0.2","\u003Cp>The standard excerpt field will appear on pages, just as it does on posts.\u003C\u002Fp>\n\u003Cp>Additionally, there is a new widget to display the excerpt of a selected page.\u003C\u002Fp>\n\u003Cp>Created by \u003Ca href=\"http:\u002F\u002Fflightless.us\u002F\" rel=\"nofollow ugc\">Flightless\u003C\u002Fa>\u003C\u002Fp>\n","Adds an excerpt field to pages, and provides a widget for displaying page excerpts",100,8506,"2012-11-27T16:07:00.000Z","3.5.2",[48,49,50],"excerpts","pages","widget","http:\u002F\u002Fxplus3.net\u002F2010\u002F09\u002F15\u002Fexcerpts-for-wordpress-pages\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fpage-excerpts.1.0.2.zip",{"slug":54,"name":55,"version":56,"author":5,"author_profile":6,"description":57,"short_description":58,"active_installs":59,"downloaded":60,"rating":43,"num_ratings":10,"last_updated":61,"tested_up_to":62,"requires_at_least":63,"requires_php":27,"tags":64,"homepage":70,"download_link":71,"security_score":72,"vuln_count":10,"unpatched_count":10,"last_vuln_date":73,"fetched_at":36},"doaj-export","DOAJ Export","1.0.4","\u003Cp>This plugin adds a feed to your site that uses the \u003Ca href=\"http:\u002F\u002Fwww.doaj.org\u002Fdoaj?func=loadTempl&templ=070509\" rel=\"nofollow ugc\">DOAJ article XML schema\u003C\u002Fa>. The XML file it creates would be suitable for uploading to the \u003Ca href=\"http:\u002F\u002Fwww.doaj.org\u002F\" rel=\"nofollow ugc\">Directory of Open Access Journals\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch4>Known Problems\u003C\u002Fh4>\n\u003Col>\n\u003Cli>The language code cannot be changed from “eng”.\u003C\u002Fli>\n\u003Cli>Does not play well with the FeedBurner FeedSmith plugin (which redirects you to your FeedBurner feed, so you never see the DOAJ XML output).\u003C\u002Fli>\n\u003C\u002Fol>\n","Adds a feed for exporting your data using the DOAJ article XML schema.",40,3411,"2008-11-03T21:35:00.000Z","2.6","2.3",[65,66,67,68,69],"doaj","journal","metadata","open-access","xml","http:\u002F\u002Fxplus3.net\u002F2008\u002F11\u002F03\u002Fdoaj-export\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fdoaj-export.1.0.4.zip",63,"2025-09-22 00:00:00",{"slug":75,"name":76,"version":77,"author":5,"author_profile":6,"description":78,"short_description":79,"active_installs":80,"downloaded":81,"rating":34,"num_ratings":34,"last_updated":82,"tested_up_to":83,"requires_at_least":84,"requires_php":27,"tags":85,"homepage":90,"download_link":91,"security_score":33,"vuln_count":34,"unpatched_count":34,"last_vuln_date":35,"fetched_at":36},"image-upload-helper","Image Upload Helper","1.0","\u003Cp>WordPress has a wonderful JavaScript\u002Fiframe dialog for uploading or choosing images to use\u003Cbr \u002F>\nin posts or as featured thumbnails. Repurposing this dialog for other uses is difficult.\u003Cbr \u002F>\nImage Upload Helper is a simple library that helps you add an image upload\u002Fselection field\u003Cbr \u002F>\nanywhere in the WordPress admin, using a single function.\u003C\u002Fp>\n\u003Cp>Created by \u003Ca href=\"http:\u002F\u002Fflightless.us\" rel=\"nofollow ugc\">Flightless\u003C\u002Fa> with significant credit to \u003Ca href=\"http:\u002F\u002Ftri.be\" rel=\"nofollow ugc\">Modern Tribe\u003C\u002Fa>\u003C\u002Fp>\n","A useful library for adding image upload fields to your plugin or admin page.",10,1966,"2012-06-09T20:45:00.000Z","3.3.2","3.3",[86,87,88,89],"admin","images","library","uploading","https:\u002F\u002Fgithub.com\u002Fflightless\u002Fimage-upload-helper","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fimage-upload-helper.zip",{"slug":93,"name":94,"version":95,"author":5,"author_profile":6,"description":96,"short_description":97,"active_installs":80,"downloaded":98,"rating":34,"num_ratings":34,"last_updated":99,"tested_up_to":100,"requires_at_least":101,"requires_php":27,"tags":102,"homepage":106,"download_link":107,"security_score":33,"vuln_count":34,"unpatched_count":34,"last_vuln_date":35,"fetched_at":36},"issue-manager","Issue Manager","1.4.3","\u003Cp>Allows an editor to publish an “issue”, which is to say, all pending posts with a given category, all at once. Until a category is published, all posts with that category will remain in the pending state.\u003C\u002Fp>\n\u003Cp>Note: The current version works with version 2.7+. If you are using WordPress version 2.6.x, use an older version of this plugins (1.3.x is recommended).\u003C\u002Fp>\n","Allows an editor to publish an \"issue\", which is to say, all pending posts with a given category, all at once. Until a category is published &hellip;",4338,"2009-09-06T20:40:00.000Z","2.8","2.7",[86,66,103,104,105],"magazine","management","publish","http:\u002F\u002Fxplus3.net\u002F2008\u002F09\u002F26\u002Fissue-manager\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fissue-manager.1.4.4.zip",{"slug":109,"name":110,"version":111,"author":5,"author_profile":6,"description":112,"short_description":113,"active_installs":80,"downloaded":114,"rating":115,"num_ratings":116,"last_updated":117,"tested_up_to":118,"requires_at_least":119,"requires_php":27,"tags":120,"homepage":124,"download_link":125,"security_score":126,"vuln_count":10,"unpatched_count":34,"last_vuln_date":127,"fetched_at":36},"mailgun-subscriptions","Mailgun Subscriptions","1.3.3","\u003Cp>Add a Mailgun subscription form to your WordPress site. Your visitors can use the form to subscribe to your lists using the Mailgun API.\u003C\u002Fp>\n","Add a Mailgun subscription form to your WordPress site. Your visitors can use the form to subscribe to your lists using the Mailgun API.",3040,70,4,"2025-12-07T18:54:00.000Z","6.9.4","3.9",[121,122,123,50],"email","mailing-lists","subscriptions","https:\u002F\u002Fgithub.com\u002Fflightless\u002Fmailgun-subscriptions","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fmailgun-subscriptions.1.3.3.zip",99,"2025-12-11 18:35:18"]