[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fZCBQpCDH5mYtD0zndXUONxrb-jq263SZNjqQnylf4S8":3},{"slug":4,"name":5,"version":6,"author":7,"author_profile":8,"description":9,"short_description":10,"active_installs":11,"downloaded":12,"rating":13,"num_ratings":14,"last_updated":15,"tested_up_to":16,"requires_at_least":17,"requires_php":18,"tags":19,"homepage":25,"download_link":26,"security_score":27,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30,"vulnerabilities":31,"developer":32,"crawl_stats":29,"alternatives":39,"analysis":139,"fingerprints":259},"posts-to-posts","Posts 2 Posts","1.7.8","scribu","https:\u002F\u002Fprofiles.wordpress.org\u002Fscribu\u002F","\u003Cp>This plugin allows you to create many-to-many relationships between posts of any type: post, page, custom etc. A few example use cases:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>manually curated lists of related posts\u003C\u002Fli>\n\u003Cli>post series\u003C\u002Fli>\n\u003Cli>products connected to retailers\u003C\u002Fli>\n\u003Cli>etc.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Additionally, you can create many-to-many relationships between posts and users. So, you could also implement:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>favorite posts of users\u003C\u002Fli>\n\u003Cli>multiple authors per post\u003C\u002Fli>\n\u003Cli>etc.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Support & Maintenance\u003C\u002Fh4>\n\u003Cp>AyeCode Ltd have committed to security and maintenance updates due to this plugins requirement in our \u003Ca href=\"https:\u002F\u002Fwpgeodirectory.com\u002Fdownloads\u002Flist-manager\u002F\" rel=\"nofollow ugc\">List Manager Extension.\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>~~I, scribu, will not be offering support (either free or paid) for this plugin anymore.~~\u003C\u002Fp>\n\u003Cp>If you want to help maintain the plugin, fork it \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fscribu\u002Fwp-posts-to-posts\" rel=\"nofollow ugc\">on github\u003C\u002Fa> and open pull requests.\u003C\u002Fp>\n\u003Cp>Links: \u003Ca href=\"http:\u002F\u002Fgithub.com\u002Fscribu\u002Fwp-posts-to-posts\u002Fwiki\" rel=\"nofollow ugc\">\u003Cstrong>Documentation\u003C\u002Fstrong>\u003C\u002Fa> | \u003Ca href=\"http:\u002F\u002Fscribu.net\u002Fwordpress\u002Fposts-to-posts\" rel=\"nofollow ugc\">Plugin News\u003C\u002Fa> | \u003Ca href=\"http:\u002F\u002Fscribu.net\" rel=\"nofollow ugc\">Author’s Site\u003C\u002Fa>\u003C\u002Fp>\n","Efficient many-to-many connections between posts, pages, custom post types, users.",10000,403687,96,101,"2026-03-06T04:35:00.000Z","6.9.4","6.0","5.6",[20,21,22,23,24],"connections","custom-post-types","many-to-many","relationships","users","http:\u002F\u002Fscribu.net\u002Fwordpress\u002Fposts-to-posts","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fposts-to-posts.1.7.8.zip",100,0,null,"2026-03-15T15:16:48.613Z",[],{"slug":7,"display_name":7,"profile_url":8,"plugin_count":33,"total_installs":34,"avg_security_score":35,"avg_patch_time_days":36,"trust_score":37,"computed_at":38},20,27990,86,4851,69,"2026-04-04T04:54:06.420Z",[40,61,80,99,116],{"slug":41,"name":42,"version":43,"author":44,"author_profile":45,"description":46,"short_description":47,"active_installs":48,"downloaded":49,"rating":27,"num_ratings":50,"last_updated":51,"tested_up_to":52,"requires_at_least":53,"requires_php":54,"tags":55,"homepage":58,"download_link":59,"security_score":60,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30},"posts-2-posts-relationships","Posts 2 Posts Relationships","1.0.0","wp-centrics","https:\u002F\u002Fprofiles.wordpress.org\u002Fwpcentrics\u002F","\u003Cp>This plugin allows you to create many-to-many relationships between posts of any type: post, page, custom post types, etc.\u003C\u002Fp>\n\u003Cp>Configure post 2 post connections easily in a friendly interface.\u003C\u002Fp>\n\u003Cp>The new connection metaboxes will appear on the related post edition pages. Search text, post type and term combo filter available as option for it.\u003C\u002Fp>\n\u003Cp>Use the standard WP_Query() and get_posts() to get the related posts.\u003C\u002Fp>\n\u003Cp>Solid-rock relationships: use his own database table, updated on post status change and removed on post deletion.\u003C\u002Fp>\n\u003Ch4>Getting related: the WP_Query way\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>\u002F\u002F inside main loop, current post ID (p2p_rel_post_id) not needed, current post will be used if you don't set it:\n\n$args = array(\n    'p2p_rel_key'        => 'prod_to_bars',  \u002F\u002F This is your connection key name. Required.\n    'p2p_rel_post_id'    => 1,               \u002F\u002F The post ID. Inside main loop dont needed.\n    'p2p_rel_direction'  => 'any',           \u002F\u002F The connection direction. 'any' by default. Optional. Explained below. ( can be 'any' | 'from_to' | 'to_from' )\n\n    \u002F\u002F Of course, here you can add the standard WP arguments you need: post type, status, dates, pagination, etc.\n); \n\n\u002F\u002F (at this point, as any other WP looping):\n\n\u002F\u002F The Query \n$the_query = new WP_Query( $args );\n\n\u002F\u002F The Loop\nif ( $the_query->have_posts() ) {\n    echo '\u003Cul>';\n    while ( $the_query->have_posts() ) {\n        $the_query->the_post();\n        echo '\u003Cli>' . get_the_title() . '\u003C\u002Fli>';\n    }\n    echo '\u003C\u002Ful>';\n} else {\n    \u002F\u002F no posts found\n    echo '\u003Cp>Nothing related\u003C\u002Fp>';\n}\n\n\u002F\u002F Restore original Post Data \nwp_reset_postdata();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Getting related: the get_posts() way\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>\u002F\u002F inside main loop, current post ID (p2p_rel_post_id) not needed, current post will be used if you don't set it:\n\n$args = array(\n    'p2p_rel_key'        => 'prod_to_bars', \u002F\u002F This is your connection key name. Required.\n    'p2p_rel_post_id'    => 1,              \u002F\u002F The post ID. Inside main loop dont needed\n    'p2p_rel_direction'  => 'any',          \u002F\u002F The connection direction. 'any' by default. Optional. Explained below. ( can be 'any' | 'from_to' | 'to_from' )\n    'post_type'          => 'any',          \u002F\u002F The filtered post types, can be an array. Optional. 'post' by default. (can be 'any' for all)\n    'suppress_filters'   => false           \u002F\u002F Required\n\n    \u002F\u002F Of course, here you can add the standard WP arguments you need: post type, status, dates, pagination, etc.\n); \n\n\u002F\u002F (at this point, as any other WP looping):\n\n$rel_posts = get_posts ( $args );\n\nprint_r( $rel_posts );\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Getting related: getting it raw\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>\u002F\u002F inside main loop, current post ID (element_id) not needed, current post will be used if you don't set it:\n\n$args = array(\n    'key'           => 'prod_to_bars',  \u002F\u002F This is your connection key name. Required.\n    'element_id'    => 1,               \u002F\u002F The post ID. Inside main loop dont needed.\n    'element_type'  => 'any',           \u002F\u002F The filtered post types, can be an array. Optional. 'post' by default. (can be 'any' for all)\n    'status'        => 'any'            \u002F\u002F The filtered post status, can be an array. Optional. 'publish' by default. (can be 'any' for all)\n    'direction'     => 'any',           \u002F\u002F The connection direction. 'any' by default. Optional. Explained below. ( can be 'any' | 'from_to' | 'to_from' )\n); \n\nglobal $P2P_Relationships;\n$rel_posts = $P2P_Relationships->get_raw ( $args );\n\n\u002F\u002F Only an array of related post IDs, not the posts objects.\nprint_r ( $rel_posts ); \n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>The connection direction\u003C\u002Fh4>\n\u003Cp>By default, the connections are bidirectional (any). However, you can get related posts only in one direction: ‘from_to’ or ‘to_from’.\u003C\u002Fp>\n\u003Cp>You can do the same logic at interface level for your users in the backoffice: you can setup your connection hidding the from metabox or the to metabox (UI mode setting).\u003C\u002Fp>\n","Efficient many-to-many connections between posts, pages and custom post types.",40,1556,1,"2021-07-19T07:39:00.000Z","5.8.13","4.7","5.5",[21,22,56,57,4],"posts-2-posts","posts-relationships","","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fposts-2-posts-relationships.zip",85,{"slug":62,"name":63,"version":64,"author":65,"author_profile":66,"description":67,"short_description":68,"active_installs":69,"downloaded":70,"rating":71,"num_ratings":72,"last_updated":73,"tested_up_to":74,"requires_at_least":75,"requires_php":76,"tags":77,"homepage":78,"download_link":79,"security_score":27,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30},"mb-relationships","MB Relationships","1.12.8","Anh Tran","https:\u002F\u002Fprofiles.wordpress.org\u002Frilwis\u002F","\u003Cp>\u003Cstrong>MB Relationships\u003C\u002Fstrong> helps you create relationships between posts, pages, custom post type, terms and users. The plugin is lightweight and optimized for database and query performance.\u003C\u002Fp>\n\u003Cp>The plugin allows you to create connections from posts to posts, posts to pages and so on. Then you can perform corresponding queries to retrieve posts that are connected to or from given posts.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Meta Box Lite\u003C\u002Fstrong>\u003Cbr \u002F>\n  We recommend using \u003Ca href=\"https:\u002F\u002Fmetabox.io\u002Flite\u002F\" rel=\"nofollow ugc\">Meta Box Lite\u003C\u002Fa>, a feature-rich free UI version of Meta Box that provides UI and all free features for managing custom fields and dynamic content on WordPress, including post types, taxonomies, custom fields, and relationships.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>It supports reciprocal and bi-directional relationships.\u003C\u002Fp>\n\u003Ch3>Why Do You Need Posts To Posts Relationships In WordPress?\u003C\u002Fh3>\n\u003Cp>Post relationships is a missing part in WordPress. The only “built-in” way that mimic the post relationship in WordPress is the \u003Ccode>post_parent\u003C\u002Fcode> for pages where you can create many child pages of a page (a one-to-many relationship). Unfortunately, that’s available for pages and hierarchical post types only. Besides, it’s not many-to-many relationship.\u003C\u002Fp>\n\u003Cp>Below are some examples of posts to posts relationships that might help you see the benefit of this feature:\u003C\u002Fp>\n\u003Ch4>Creating Related Posts In WordPress\u003C\u002Fh4>\n\u003Cp>The simplest example is to manually create related posts in your WordPress website. When you edit a post, you can select posts that have similar or related content and display them in the frontend for further reading.\u003C\u002Fp>\n\u003Cp>You can also query backward: displaying posts that link to the being read post as a reference to provide more information to your readers. With this, you don’t need a WordPress related posts plugin anymore.\u003C\u002Fp>\n\u003Ch4>Example: Events And Bands\u003C\u002Fh4>\n\u003Cp>Suppose you have two custom post types, event and band, where:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>In each event there may be multiple bands, and\u003C\u002Fli>\n\u003Cli>Each band can participate in many events.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>If people want to buy tickets, they could search for events in their location and see what bands are playing on a given date, or they could search for bands they like and see what date they are playing near their location.\u003C\u002Fp>\n\u003Cp>In this example, we have created many-to-many relationships between events and bands.\u003C\u002Fp>\n\u003Ch3>Bi-directional relationships\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>MB Relationships\u003C\u002Fstrong> allows you to create bi-directional connections. You will be able to query back and forth without any problem.\u003C\u002Fp>\n\u003Cp>The data is stored in the database as a pair of (from_id, to_id), thus making it independent from either side.\u003C\u002Fp>\n\u003Cp>Besides, for each side, there’s a meta box that shows what are connected from\u002Fto. So you don’t have to worry about the direction of the connection anymore.\u003C\u002Fp>\n\u003Ch3>An Alternative For The Posts 2 Posts Plugin (P2P Plugin)\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>MB Relationships\u003C\u002Fstrong> is very much inspired by the popular plugin \u003Ca href=\"https:\u002F\u002Fwordpress.org\u002Fplugins\u002Fposts-to-posts\u002F\" rel=\"ugc\">Posts 2 Posts\u003C\u002Fa> which is not maintained anymore. We have taken the idea and made some improvements. The codebase and data structure is very similar.\u003C\u002Fp>\n\u003Ch3>Plugin features\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Simple APIs\u003C\u002Fstrong>: the plugin provides simple APIs for registering relationships and retrieving connected items. It integrates with existing WordPress APIs such as \u003Ccode>WP_Query\u003C\u002Fcode>,\u003Ccode>get_terms\u003C\u002Fcode> and \u003Ccode>get_users\u003C\u002Fcode>. See \u003Ca href=\"https:\u002F\u002Fdocs.metabox.io\u002Fextensions\u002Fmb-relationships\u002F\" rel=\"nofollow ugc\">documentation\u003C\u002Fa> for more information.\u003C\u002Fli>\n\u003Cli>Uses \u003Cstrong>custom relationship table\u003C\u002Fstrong> to store relationships. That helps optimize the database storage and query performance.\u003C\u002Fli>\n\u003Cli>You can \u003Cstrong>create relationships between any kind of content\u003C\u002Fstrong> in WordPress: posts to posts, posts to users, etc. For posts to terms and posts to users, it’s required the \u003Ca href=\"https:\u002F\u002Fmetabox.io\u002Fplugins\u002Fmb-term-meta\u002F\" rel=\"nofollow ugc\">MB Term Meta\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fmetabox.io\u002Fplugins\u002Fmb-user-meta\u002F\" rel=\"nofollow ugc\">MB User Meta\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>Supports creating \u003Cstrong>reciprocal relationships\u003C\u002Fstrong> (posts-posts, users-users, …).\u003C\u002Fli>\n\u003Cli>Supports creating \u003Cstrong>bi-directional relationships\u003C\u002Fstrong> and easily query them.\u003C\u002Fli>\n\u003Cli>Display connected items easily with \u003Cstrong>shortcode\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Extremely \u003Cstrong>lightweight and fast\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Plugin Links\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fmetabox.io\u002Fplugins\u002Fmb-relationships\u002F\" rel=\"nofollow ugc\">Project Page\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwpmetabox\u002Fmb-relationships\u002F\" rel=\"nofollow ugc\">Github Repo\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>This plugin is a free extension of \u003Ca href=\"https:\u002F\u002Fmetabox.io\" rel=\"nofollow ugc\">Meta Box\u003C\u002Fa> plugin, which is a powerful, professional solution to create custom fields and custom meta boxes for WordPress websites. Using \u003Cstrong>MB Relationships\u003C\u002Fstrong> in combination with \u003Ca href=\"https:\u002F\u002Fmetabox.io\u002Fplugins\u002F\" rel=\"nofollow ugc\">other extensions\u003C\u002Fa> will help you manage any content types in WordPress easily and make your website more professional.\u003C\u002Fp>\n\u003Ch3>You might also like\u003C\u002Fh3>\n\u003Cp>If you like this plugin, you might also like our other WordPress products:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fmetabox.io\" rel=\"nofollow ugc\">Meta Box\u003C\u002Fa> – A powerful WordPress plugin for creating custom post types and custom fields.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwpslimseo.com\" rel=\"nofollow ugc\">Slim SEO\u003C\u002Fa> – A fast, lightweight and full-featured SEO plugin for WordPress with minimal configuration.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwpslimseo.com\u002Fproducts\u002Fslim-seo-schema\u002F\" rel=\"nofollow ugc\">Slim SEO Schema\u003C\u002Fa> – An advanced, powerful and flexible plugin to add schemas to WordPress.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwpslimseo.com\u002Fproducts\u002Fslim-seo-link-manager\u002F\" rel=\"nofollow ugc\">Slim SEO Link Manager\u003C\u002Fa> – Build internal link easier in WordPress with real-time reports.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgretathemes.com\" rel=\"nofollow ugc\">GretaThemes\u003C\u002Fa> – Free and premium WordPress themes that clean, simple and just work.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fwpautolistings.com\" rel=\"nofollow ugc\">Auto Listings\u003C\u002Fa> – A car sale and dealership plugin for WordPress.\u003C\u002Fli>\n\u003C\u002Ful>\n","A lightweight solution for creating relationships between posts, terms and users in WordPress.",1000,54537,92,5,"2025-07-15T09:03:00.000Z","6.8.5","5.9","7.2",[20,4,23],"https:\u002F\u002Fmetabox.io\u002Fplugins\u002Fmb-relationships\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fmb-relationships.1.12.8.zip",{"slug":81,"name":82,"version":83,"author":84,"author_profile":85,"description":86,"short_description":87,"active_installs":88,"downloaded":89,"rating":28,"num_ratings":28,"last_updated":90,"tested_up_to":91,"requires_at_least":92,"requires_php":58,"tags":93,"homepage":97,"download_link":98,"security_score":60,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30},"custom-post-type-privacy","Custom Post Type Privacy","0.3","kimedia","https:\u002F\u002Fprofiles.wordpress.org\u002Fkimedia\u002F","\u003Cp>This is a simple plugin to allow for restricting access to content.\u003C\u002Fp>\n\u003Cp>Users may be members of multiple groups. Multiple groups and multiple individual users may be allowed to view each\u003Cbr \u002F>\npost. Overlaps are ignored — if the user is a member of any group that is allowed to view the post, that user will\u003Cbr \u002F>\nbe able to view it.\u003C\u002Fp>\n","Stable Tag 0.3 Custom Post Type Privacy allows WordPress authors to grant access to users and groups of users across all posts, pages and custom post &hellip;",10,3603,"2012-05-08T14:46:00.000Z","3.3.4","3.0",[94,21,95,96,24],"bbpress","pages","posts","http:\u002F\u002Fwww.ki-media.co.uk\u002Fwordpress\u002Fcustom-post-type-privacy\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fcustom-post-type-privacy.zip",{"slug":100,"name":101,"version":102,"author":103,"author_profile":104,"description":105,"short_description":106,"active_installs":28,"downloaded":107,"rating":28,"num_ratings":28,"last_updated":108,"tested_up_to":16,"requires_at_least":109,"requires_php":110,"tags":111,"homepage":114,"download_link":115,"security_score":27,"vuln_count":28,"unpatched_count":28,"last_vuln_date":29,"fetched_at":30},"native-content-relationships","Native Content Relationships","1.0.29","Chetan Upare","https:\u002F\u002Fprofiles.wordpress.org\u002Fchetanupare\u002F","\u003Cp>WordPress does not provide a native way to model real relationships between content items such as posts, users, and terms.\u003Cbr \u002F>\nMost solutions rely on post meta or taxonomies, which become difficult to query, scale, and maintain over time.\u003C\u002Fp>\n\u003Cp>If you’ve outgrown ACF relationship fields or post meta arrays, Native Content Relationships introduces a \u003Cstrong>structured relationship layer\u003C\u002Fstrong> for WordPress that allows you to define meaningful, queryable, and scalable relationships between content — without relying on hacks or editor-specific solutions.\u003C\u002Fp>\n\u003Cp>This plugin is designed to be \u003Cstrong>core-friendly, developer-focused, and future-proof\u003C\u002Fstrong>, built specifically for developers who have hit performance walls.\u003C\u002Fp>\n\u003Ch3>What This Plugin Solves\u003C\u002Fh3>\n\u003Cp>• Many-to-many relationships between content\u003Cbr \u002F>\n• Clean querying without meta or taxonomy abuse\u003Cbr \u002F>\n• Long-term maintainability and portability\u003Cbr \u002F>\n• Cleanly handles headless and REST WordPress setups\u003C\u002Fp>\n\u003Ch3>Key Features\u003C\u002Fh3>\n\u003Cp>• Relationships between posts, users, and terms\u003Cbr \u002F>\n• One-way or bidirectional relationships\u003Cbr \u002F>\n• Indexed database table for fast queries\u003Cbr \u002F>\n• Clean PHP API for managing relationships\u003Cbr \u002F>\n• WP_Query integration\u003Cbr \u002F>\n• REST API support with inline relations\u003Cbr \u002F>\n• Multilingual-ready (WPML \u002F Polylang)\u003Cbr \u002F>\n• WooCommerce optional integration\u003Cbr \u002F>\n• Editor- and theme-agnostic\u003C\u002Fp>\n\u003Ch3>Supported Relationship Types\u003C\u002Fh3>\n\u003Cp>• Post \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">↔\u003C\u002Fspan> Post\u003Cbr \u002F>\n• Post \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">↔\u003C\u002Fspan> User\u003Cbr \u002F>\n• Post \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">↔\u003C\u002Fspan> Term\u003Cbr \u002F>\n• User \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">↔\u003C\u002Fspan> Post\u003Cbr \u002F>\n• Term \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">↔\u003C\u002Fspan> Post\u003C\u002Fp>\n\u003Ch3>Common Use Cases\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Posts\u003C\u002Fstrong>\u003Cbr \u002F>\n• Products \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> Accessories\u003Cbr \u002F>\n• Courses \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> Lessons\u003Cbr \u002F>\n• Articles \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> Related content\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Users\u003C\u002Fstrong>\u003Cbr \u002F>\n• Favorite posts\u003Cbr \u002F>\n• Bookmarked content\u003Cbr \u002F>\n• Multiple authors or contributors\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Terms\u003C\u002Fstrong>\u003Cbr \u002F>\n• Featured categories\u003Cbr \u002F>\n• Curated collections\u003Cbr \u002F>\n• Semantic grouping beyond default taxonomies\u003C\u002Fp>\n\u003Ch3>Admin Interface\u003C\u002Fh3>\n\u003Cp>• Relationship management in post editor\u003Cbr \u002F>\n• User profile relationship management\u003Cbr \u002F>\n• Term editor relationship support\u003Cbr \u002F>\n• AJAX-powered search for posts, users, and terms\u003Cbr \u002F>\n• Modern UI matching WordPress admin style\u003C\u002Fp>\n\u003Ch3>Stability & Backward Compatibility\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Schema stable from 1.x onward. Backward compatibility guaranteed.\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>We lock the core before expanding. Ecosystem and agency confidence depend on it.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Database schema stability\u003C\u002Fstrong> — The relationship table and \u003Ccode>NCR_SCHEMA_VERSION\u003C\u002Fcode> are stable in the 1.x line. Any future schema change will be additive (new columns\u002Findexes) or run through a documented migration; no breaking table or column renames without a major version.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Backward compatibility promise\u003C\u002Fstrong> — Public PHP APIs (functions, hooks, WP_Query arguments), shortcodes, and REST endpoints will not be removed or changed in breaking ways within the 1.x branch. Deprecations will be announced and supported for at least one minor version.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Versioning policy\u003C\u002Fstrong> — 1.x = stable core. Minor\u002Fpatch releases may add features and fix bugs; they will not break existing integrations. A major version (2.x) would be the only place for intentional breaking changes, with a clear migration path.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Namespacing discipline\u003C\u002Fstrong> — One internal prefix: \u003Ccode>ncr_\u003C\u002Fcode> (functions, hooks, options), \u003Ccode>NCR_\u003C\u002Fcode> (classes, constants), \u003Ccode>ncr-\u003C\u002Fcode> (CSS\u002FIDs\u002Fhandles). No new alternate prefixes; documented and consistent so extensions and ecosystem plugins can rely on a stable surface.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Architected for Performance & Scale\u003C\u002Fh3>\n\u003Cp>Native Content Relationships is built for high-volume enterprise and headless WordPress sites. Forget the performance bottleneck of post-meta.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Index Optimization\u003C\u002Fstrong>: Built on composite covering indexes (\u003Ccode>type_lookup\u003C\u002Fcode>) and a smart query planner optimized for performance.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Micro-Optimized Validations\u003C\u002Fstrong>: SQL-native validations ensure sub-2ms P95 latency even at 1M+ rows.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Object Cache Integration\u003C\u002Fstrong>: Full compatibility with object cache through group isolation, targeted relationship cache invalidation, and bulk priming strategies.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Performance Diagnostics\u003C\u002Fstrong>: Includes a powerful CLI diagnostic utility to check and fix integrity without UI bloat.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Benchmarks confirm stable performance with 1,000,000+ relationship rows under InnoDB.\u003C\u002Fstrong>\u003Cbr \u002F>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fchetanupare\u002FWP-Native-Content-Relationships\u002Fblob\u002Fmain\u002Fdocs\u002FPERFORMANCE.md\" rel=\"nofollow ugc\">View Full Performance Report\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>ACF Migration (Escape Meta Technical Debt)\u003C\u002Fh3>\n\u003Cp>If you store relationships in \u003Cstrong>Advanced Custom Fields\u003C\u002Fstrong> relationship fields or standard Post Meta, you can safely migrate to Native Content Relationships to unlock immediate performance and querying benefits.\u003C\u002Fp>\n\u003Cp>A built-in script allows you to selectively migrate ACF related data into the new performant table, allowing you to gradually refactor out technical debt.\u003Cbr \u002F>\nCheck out the dedicated one-time migration guide here: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fchetanupare\u002FWP-Native-Content-Relationships\u002Fblob\u002Fmain\u002Fdocs\u002Fmigration\u002Ffrom-acf.md\" rel=\"nofollow ugc\">docs\u002Fmigration\u002Ffrom-acf.md\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch3>Advanced Developer APIs\u003C\u002Fh3>\n\u003Cp>Built to be a complete content relationship modeling engine:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Relationship Type Registration API\u003C\u002Fstrong>: Programmatic type registration for custom relationships, with schema validation and strict directional logic.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Relationship Constraints\u003C\u002Fstrong>: Declare relationship constraints like 1:1, 1:N, or M:N and strictly enforce maximum capacities and duplicates. \u003C\u002Fli>\n\u003Cli>\u003Cstrong>Advanced Query Parameters\u003C\u002Fstrong>: Inject the \u003Ccode>content_relation\u003C\u002Fcode> argument directly into your \u003Ccode>WP_Query\u003C\u002Fcode> with parameters specifically designed for advanced use cases: include multiple relationship types, apply exclusionary rules, combine \u003Ccode>OR\u003C\u002Fcode>\u002F\u003Ccode>AND\u003C\u002Fcode> relations, or filter by minimum\u002Fmaximum thresholds. \u003C\u002Fli>\n\u003Cli>\u003Cstrong>Bulk Operations API\u003C\u002Fstrong>: Optimized batch operations to bulk attach, bulk detach, and WP-CLI data import designed specifically for use cases when scaling up and executing large workloads.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Lightweight Metadata\u003C\u002Fstrong> Add context to relationships natively using relationship metadata (allow order rankings, contexts, descriptions, tracking data, etc.) via a dedicated relationship metadata registry and table.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Graph Utility Layer\u003C\u002Fstrong> An ultra-minimal set of APIs and WP-CLI commands that generate graph diagnostics—useful for acquiring relationship counts, calculating the most connected posts, isolating orphaned items, and running background integrity checks.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Headless REST Readiness\u003C\u002Fh3>\n\u003Cp>For decoupled and highly dynamic solutions, Native Content Relationships includes powerful headless optimizations:\u003C\u002Fp>\n\u003Cp>Append \u003Ccode>?naticore_relations=1\u003C\u002Fcode> or \u003Ccode>?_embed=relations\u003C\u002Fcode> into your standard core endpoint fetches (e.g., \u003Ccode>wp\u002Fv2\u002Fposts\u003C\u002Fcode>) to embed related data inside your response arrays instantly, minimizing round trips.\u003C\u002Fp>\n\u003Ch3>Integrations\u003C\u002Fh3>\n\u003Cp>• WooCommerce (product relationships)\u003Cbr \u002F>\n• WPML \u002F Polylang (relationship mirroring)\u003Cbr \u002F>\n• Elementor (dynamic content support)\u003Cbr \u002F>\n• Gutenberg (related content block)\u003Cbr \u002F>\n• Advanced Custom Fields (one-time migration tool)\u003C\u002Fp>\n\u003Ch3>Page Builder Integration\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Elementor:\u003C\u002Fstrong>\u003Cbr \u002F>\n* \u003Cstrong>Compatible with:\u003C\u002Fstrong> Elementor 2.0+\u003Cbr \u002F>\n* \u003Cstrong>Features:\u003C\u002Fstrong> Comprehensive Dynamic Tags suite for relationships\u003Cbr \u002F>\n* \u003Cstrong>Auto-detected:\u003C\u002Fstrong> Yes (no configuration needed)\u003Cbr \u002F>\n* \u003Cstrong>Tested up to:\u003C\u002Fstrong> Elementor 3.20\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Elementor Dynamic Tags:\u003C\u002Fstrong>\u003Cbr \u002F>\n* \u003Cstrong>Related Posts\u003C\u002Fstrong>: Display related posts with customizable output formats\u003Cbr \u002F>\n* \u003Cstrong>Related Users\u003C\u002Fstrong>: Display users with relationships (favorites, bookmarks, etc.)\u003Cbr \u002F>\n* \u003Cstrong>Related Terms\u003C\u002Fstrong>: Display taxonomy terms with relationships\u003Cbr \u002F>\n* \u003Cstrong>Flexible Output\u003C\u002Fstrong>: IDs, titles, links, avatars, count-only options\u003Cbr \u002F>\n* \u003Cstrong>Direction Support\u003C\u002Fstrong>: Both outgoing and incoming relationships\u003Cbr \u002F>\n* \u003Cstrong>Native Controls\u003C\u002Fstrong>: Relationship type selector with validation\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Gutenberg:\u003C\u002Fstrong>\u003Cbr \u002F>\n* \u003Cstrong>Compatible with:\u003C\u002Fstrong> WordPress 5.0+ (Core)\u003Cbr \u002F>\n* \u003Cstrong>Features:\u003C\u002Fstrong> “Related Content” block with relationship filtering\u003Cbr \u002F>\n* \u003Cstrong>Always available:\u003C\u002Fstrong> Yes (core WordPress feature)\u003Cbr \u002F>\n* \u003Cstrong>Tested up to:\u003C\u002Fstrong> WordPress 6.5\u003C\u002Fp>\n\u003Ch4>Shortcodes\u003C\u002Fh4>\n\u003Cp>Use these in posts, pages, or widgets. They use the current post ID when not specified.\u003C\u002Fp>\n\u003Cp>\u003Cem>Related posts (default: type=related_to, limit=5):\u003C\u002Fem>\u003Cbr \u002F>\n[naticore_related_posts type=”related_to” limit=”5″ order=”date” layout=”list” title=”Related Content” class=”my-class”]\u003C\u002Fp>\n\u003Cp>\u003Cem>Related users (default: type=authored_by):\u003C\u002Fem>\u003Cbr \u002F>\n[naticore_related_users type=”authored_by” limit=”10″ order=”name” layout=”list” title=”Authors”]\u003C\u002Fp>\n\u003Cp>\u003Cem>Related terms (default: type=categorized_as):\u003C\u002Fem>\u003Cbr \u002F>\n[naticore_related_terms type=”categorized_as” limit=”5″ order=”name” layout=”grid” title=”Categories”]\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Attributes (all shortcodes):\u003C\u002Fstrong>\u003Cbr \u002F>\n* type – Relationship type slug (e.g. related_to, parent_of, authored_by, categorized_as)\u003Cbr \u002F>\n* limit – Number of items (1–50), default 5\u003Cbr \u002F>\n* order – Sort: date, title (posts) or name (users\u002Fterms)\u003Cbr \u002F>\n* post_id – Post ID; omit to use current post\u003Cbr \u002F>\n* layout – list or grid\u003Cbr \u002F>\n* title – Heading text above the list (optional)\u003Cbr \u002F>\n* class – Extra CSS class(es) for the wrapper\u003Cbr \u002F>\n* show_thumbnail – 1 to show post thumbnail (posts shortcode only), default 0\u003Cbr \u002F>\n* excerpt_length – Number of words for excerpt (0 = hide), default 0\u003C\u002Fp>\n\u003Ch4>Widget\u003C\u002Fh4>\n\u003Cp>\u003Cstrong>Related Content (NCR)\u003C\u002Fstrong> is available under Appearance \u003Cspan aria-hidden=\"true\" class=\"wp-exclude-emoji\">→\u003C\u002Fspan> Widgets. Add it to any sidebar or widget area.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Title\u003C\u002Fstrong> – Optional widget title (leave blank to use the shortcode’s default “Related Content” heading)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Relationship type\u003C\u002Fstrong> – e.g. Related To, Parent Of, Depends On\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Number of items\u003C\u002Fstrong> – 1–50\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Order by\u003C\u002Fstrong> – Date or Title\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Post ID (optional)\u003C\u002Fstrong> – Leave 0 to use the current post; set a post ID to show relations for a specific post\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Output matches the shortcode (same markup and styles when the shortcode CSS is enqueued).\u003C\u002Fp>\n\u003Ch3>Developer Guide (Advanced)\u003C\u002Fh3>\n\u003Cp>This section is intended for developers who want programmatic control.\u003C\u002Fp>\n\u003Ch4>Core API\u003C\u002Fh4>\n\u003Cp>Add a relationship:\u003Cbr \u002F>\n    wp_add_relation( $from_id, $to_id, $type );\u003C\u002Fp>\n\u003Cp>Get related items:\u003Cbr \u002F>\n    wp_get_related( $id, $type );\u003C\u002Fp>\n\u003Cp>Check relationship:\u003Cbr \u002F>\n    wp_is_related( $from_id, $to_id, $type );\u003C\u002Fp>\n\u003Cp>Remove relationship:\u003Cbr \u002F>\n    wp_remove_relation( $from_id, $to_id, $type );\u003C\u002Fp>\n\u003Ch4>WP_Query Integration\u003C\u002Fh4>\n\u003Cp>new WP_Query( array(\u003Cbr \u002F>\n‘post_type’ => ‘post’,\u003Cbr \u002F>\n‘content_relation’ => array(\u003Cbr \u002F>\n‘post_id’ => 123,\u003Cbr \u002F>\n‘type’ => ‘related_to’,\u003Cbr \u002F>\n),\u003Cbr \u002F>\n) );\u003C\u002Fp>\n\u003Ch4>REST API\u003C\u002Fh4>\n\u003Cp>Endpoints available under:\u003Cbr \u002F>\n    \u002Fwp-json\u002Fnaticore\u002Fv1\u002F\u003C\u002Fp>\n\u003Cp>• Create relationships\u003Cbr \u002F>\n• Fetch related content\u003Cbr \u002F>\n• Delete relationships\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Embed relations in core REST responses (headless):\u003C\u002Fstrong>\u003Cbr \u002F>\nAdd \u003Ccode>?naticore_relations=1\u003C\u002Fcode> to any core resource request to include a \u003Ccode>naticore_relations\u003C\u002Fcode> array in the response. Works with:\u003Cbr \u002F>\n• \u003Ccode>GET \u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u002F\u003Cid>?naticore_relations=1\u003C\u002Fcode>\u003Cbr \u002F>\n• \u003Ccode>GET \u002Fwp-json\u002Fwp\u002Fv2\u002Fusers\u002F\u003Cid>?naticore_relations=1\u003C\u002Fcode>\u003Cbr \u002F>\n• \u003Ccode>GET \u002Fwp-json\u002Fwp\u002Fv2\u002Fcategories\u002F\u003Cid>?naticore_relations=1\u003C\u002Fcode> (and other taxonomies)\u003Cbr \u002F>\nEach relation item includes \u003Ccode>to_id\u003C\u002Fcode>, \u003Ccode>to_type\u003C\u002Fcode>, \u003Ccode>type\u003C\u002Fcode>, and optional \u003Ccode>title\u003C\u002Fcode>\u002F\u003Ccode>display_name\u003C\u002Fcode>\u002F\u003Ccode>name\u003C\u002Fcode>. Opt-in only so default requests stay fast.\u003C\u002Fp>\n\u003Ch4>Hooks & Filters\u003C\u002Fh4>\n\u003Cp>Actions:\u003Cbr \u002F>\n• \u003Ccode>naticore_relation_added\u003C\u002Fcode>\u003Cbr \u002F>\n• \u003Ccode>naticore_relation_removed\u003C\u002Fcode>\u003Cbr \u002F>\n• \u003Ccode>naticore_after_duplicate_post\u003C\u002Fcode> – fired after copying relations from one post to another (args: from_post_id, to_post_id, result array)\u003C\u002Fp>\n\u003Cp>Filters:\u003Cbr \u002F>\n• \u003Ccode>naticore_relation_is_allowed\u003C\u002Fcode>\u003Cbr \u002F>\n• \u003Ccode>naticore_get_related_args\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Duplicate post:\u003C\u002Fstrong> Use helper \u003Ccode>naticore_copy_relations( $from_post_id, $to_post_id, $relation_types = null )\u003C\u002Fcode> to copy relationships when duplicating a post. Returns array with keys \u003Ccode>copied\u003C\u002Fcode>, \u003Ccode>skipped\u003C\u002Fcode>, \u003Ccode>errors\u003C\u002Fcode>. Out-of-the-box integration: Yoast Duplicate Post, Post Duplicator (metaphorcreations), Copy & Delete Posts (Inisev).\u003C\u002Fp>\n\u003Ch4>Elementor Integration\u003C\u002Fh4>\n\u003Cp>This plugin provides comprehensive Elementor Dynamic Tags for displaying relationships in Elementor-powered designs.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Available Dynamic Tags:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>Related Posts\u003C\u002Fstrong> (ncr-related-posts)\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Display posts related to the current post\u003C\u002Fli>\n\u003Cli>Supports all post-to-post relationship types\u003C\u002Fli>\n\u003Cli>Output formats: IDs, titles, links, count\u003C\u002Fli>\n\u003Cli>Direction control: outgoing\u002Fincoming\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Related Users\u003C\u002Fstrong> (ncr-related-users)\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Display users with relationships to posts\u003C\u002Fli>\n\u003Cli>Supports user relationship types (favorites, bookmarks, etc.)\u003C\u002Fli>\n\u003Cli>Output formats: IDs, names, emails, avatars, profile links\u003C\u002Fli>\n\u003Cli>Direction control: posts-to-users\u002Fusers-to-posts\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Related Terms\u003C\u002Fstrong> (ncr-related-terms)\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Display taxonomy terms with relationships\u003C\u002Fli>\n\u003Cli>Supports term relationship types (categories, tags, etc.)\u003C\u002Fli>\n\u003Cli>Output formats: IDs, names, slugs, archive links\u003C\u002Fli>\n\u003Cli>Direction control: posts-to-terms\u002Fterms-to-posts\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Usage Examples:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cem>Display related post IDs:\u003C\u002Fem>\u003Cbr \u002F>\n    \u003Ccode>[ncr-related-posts relationship_type=\"related_to\" output_format=\"ids\" limit=\"5\"]\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cem>Display user avatars:\u003C\u002Fem>\u003Cbr \u002F>\n    \u003Ccode>[ncr-related-users relationship_type=\"favorite_posts\" output_format=\"avatar_images\" avatar_size=\"48\"]\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cem>Display term links:\u003C\u002Fem>\u003Cbr \u002F>\n    \u003Ccode>[ncr-related-terms relationship_type=\"categorized_as\" output_format=\"term_links\" limit=\"10\"]\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cem>Get count of related items:\u003C\u002Fem>\u003Cbr \u002F>\n    \u003Ccode>[ncr-related-posts relationship_type=\"related_to\" output_format=\"count\"]\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Advanced Features:\u003C\u002Fstrong>\u003Cbr \u002F>\n– \u003Cstrong>Context-aware\u003C\u002Fstrong>: Automatically detects current post, user, or term context\u003Cbr \u002F>\n– \u003Cstrong>Fallback content\u003C\u002Fstrong>: Display custom text when no relationships found\u003Cbr \u002F>\n– \u003Cstrong>Pagination support\u003C\u002Fstrong>: Limit results for performance\u003Cbr \u002F>\n– \u003Cstrong>Ordering options\u003C\u002Fstrong>: Sort by date, title, or random\u003Cbr \u002F>\n– \u003Cstrong>Multi-language\u003C\u002Fstrong>: Works with WPML\u002FPolylang translations\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Integration Benefits:\u003C\u002Fstrong>\u003Cbr \u002F>\n– \u003Cstrong>Native Elementor experience\u003C\u002Fstrong>: Tags appear in Elementor’s Dynamic Tags panel\u003Cbr \u002F>\n– \u003Cstrong>No templates forced\u003C\u002Fstrong>: Users control output format and styling\u003Cbr \u002F>\n– \u003Cstrong>Performance optimized\u003C\u002Fstrong>: Uses cached relationship data\u003Cbr \u002F>\n– \u003Cstrong>Optional dependency\u003C\u002Fstrong>: Only loads when Elementor is active\u003C\u002Fp>\n\u003Ch4>WP-CLI\u003C\u002Fh4>\n\u003Cp>• List relationships\u003Cbr \u002F>\n• Add \u002F remove relationships\u003Cbr \u002F>\n• Integrity checks\u003C\u002Fp>\n\u003Ch3>Contributing\u003C\u002Fh3>\n\u003Cp>Contributions are welcome.\u003Cbr \u002F>\nGitHub: https:\u002F\u002Fgithub.com\u002Fchetanupare\u002FWP-Native-Content-Relationships\u003C\u002Fp>\n\u003Ch3>License\u003C\u002Fh3>\n\u003Cp>GPLv2 or later\u003C\u002Fp>\n","Add first-class relationships between posts, users, and terms using a fast, structured, and scalable architecture.",351,"2026-02-21T18:45:00.000Z","5.0","7.4",[112,96,23,113,24],"content","terms","https:\u002F\u002Fchetanupare.github.io\u002FWP-Native-Content-Relationships\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fnative-content-relationships.1.0.29.zip",{"slug":117,"name":118,"version":119,"author":120,"author_profile":121,"description":122,"short_description":123,"active_installs":124,"downloaded":125,"rating":71,"num_ratings":126,"last_updated":127,"tested_up_to":16,"requires_at_least":128,"requires_php":110,"tags":129,"homepage":134,"download_link":135,"security_score":136,"vuln_count":137,"unpatched_count":28,"last_vuln_date":138,"fetched_at":30},"custom-post-type-ui","Custom Post Type UI","1.18.3","webdevstudios","https:\u002F\u002Fprofiles.wordpress.org\u002Fwebdevstudios\u002F","\u003Cp>Custom Post Type UI provides an easy-to-use interface for registering and managing custom post types and taxonomies for your website.\u003C\u002Fp>\n\u003Ch4>Custom Post Type UI Extended\u003C\u002Fh4>\n\u003Cp>CPTUI helps create custom content types, but displaying that content can be a whole new challenge. \u003Ca href=\"https:\u002F\u002Fpluginize.com\u002Fplugins\u002Fcustom-post-type-ui-extended\u002F?utm_source=cptui-desription&utm_medium=text&utm_campaign=wporg\" rel=\"nofollow ugc\">Custom Post Type UI Extended\u003C\u002Fa> was created to help with displaying your crafted content. \u003Ca href=\"https:\u002F\u002Fpluginize.com\u002Fcpt-ui-extended-features\u002F?utm_source=cptui-description-examples&utm_medium=text&utm_campaign=wporg\" rel=\"nofollow ugc\">View our Layouts page\u003C\u002Fa> to see available layout examples with Custom Post Type UI Extended.\u003C\u002Fp>\n\u003Ch4>Plugin development\u003C\u002Fh4>\n\u003Cp>Custom Post Type UI development is managed on GitHub, with official releases published on WordPress.org. The GitHub repo can be found at \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FWebDevStudios\u002Fcustom-post-type-ui\" rel=\"nofollow ugc\">https:\u002F\u002Fgithub.com\u002FWebDevStudios\u002Fcustom-post-type-ui\u003C\u002Fa>. Please use the WordPress.org support tab for potential bugs, issues, or enhancement ideas.\u003C\u002Fp>\n","Admin UI for creating custom content types like post types and taxonomies",1000000,22529808,273,"2026-01-08T20:43:00.000Z","6.6",[130,21,131,132,133],"content-types","post-type","taxonomy","types","https:\u002F\u002Fgithub.com\u002FWebDevStudios\u002Fcustom-post-type-ui\u002F","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fcustom-post-type-ui.1.18.3.zip",93,4,"2025-12-12 00:00:00",{"attackSurface":140,"codeSignals":219,"taintFlows":249,"riskAssessment":250,"analyzedAt":258},{"hooks":141,"ajaxHandlers":210,"restRoutes":216,"shortcodes":217,"cronEvents":218,"entryPointCount":50,"unprotectedCount":28},[142,147,150,155,159,162,166,172,176,178,179,183,186,188,190,194,198,202,205],{"type":143,"name":144,"callback":144,"file":145,"line":146},"action","add_meta_boxes","admin\\box-factory.php",12,{"type":143,"name":148,"callback":148,"priority":88,"file":145,"line":149},"save_post",13,{"type":143,"name":151,"callback":152,"file":153,"line":154},"admin_footer","add_templates","admin\\box.php",57,{"type":143,"name":156,"callback":157,"file":158,"line":88},"load-edit.php","add_items","admin\\column-factory.php",{"type":143,"name":160,"callback":157,"file":158,"line":161},"load-users.php",11,{"type":143,"name":163,"callback":164,"file":158,"line":165},"admin_print_styles","styles",21,{"type":143,"name":167,"callback":168,"priority":169,"file":170,"line":171},"pre_user_query","user_query",9,"admin\\column-user.php",8,{"type":173,"name":174,"callback":175,"priority":88,"file":170,"line":88},"filter","manage_users_custom_column","display_column",{"type":143,"name":156,"callback":157,"file":177,"line":88},"admin\\dropdown-factory.php",{"type":143,"name":160,"callback":157,"file":177,"line":161},{"type":173,"name":180,"callback":181,"file":182,"line":171},"request","massage_query","admin\\dropdown-post.php",{"type":143,"name":184,"callback":185,"file":182,"line":88},"restrict_manage_posts","show_dropdown",{"type":143,"name":167,"callback":181,"priority":169,"file":187,"line":171},"admin\\dropdown-user.php",{"type":143,"name":189,"callback":185,"file":187,"line":88},"restrict_manage_users",{"type":143,"name":191,"callback":192,"priority":88,"file":193,"line":88},"p2p_registered_connection_type","check_ctype","admin\\factory.php",{"type":143,"name":195,"callback":196,"file":197,"line":146},"admin_init","init_args","admin\\tools-page.php",{"type":143,"name":199,"callback":200,"file":197,"line":201},"admin_notices","maybe_install",14,{"type":143,"name":191,"callback":203,"file":204,"line":72},"_p2p_register_missing_post_types","debug-utils.php",{"type":143,"name":206,"callback":207,"file":208,"line":209},"wp_loaded","_p2p_init","posts-to-posts.php",71,[211],{"action":212,"nopriv":213,"callback":214,"hasNonce":215,"hasCapCheck":213,"file":145,"line":201},"p2p_box",false,"wp_ajax_p2p_box",true,[],[],[],{"dangerousFunctions":220,"sqlUsage":221,"outputEscaping":226,"fileOperations":50,"externalRequests":28,"nonceChecks":247,"capabilityChecks":50,"bundledLibraries":248},[],{"prepared":28,"raw":50,"locations":222},[223],{"file":197,"line":224,"context":225},120,"$wpdb->get_results() with variable interpolation",{"escaped":227,"rawEcho":227,"locations":228},7,[229,232,234,237,240,243,245],{"file":153,"line":230,"context":231},66,"raw output",{"file":153,"line":233,"context":231},87,{"file":235,"line":236,"context":231},"admin\\column-post.php",33,{"file":238,"line":239,"context":231},"admin\\column.php",53,{"file":241,"line":242,"context":231},"admin\\dropdown.php",17,{"file":197,"line":244,"context":231},114,{"file":204,"line":246,"context":231},31,2,[],[],{"summary":251,"deductions":252},"The posts-to-posts plugin, version 1.7.8, exhibits a generally strong security posture based on the provided static analysis and vulnerability history. The plugin effectively protects its single AJAX entry point with nonce and capability checks, and there are no public REST API routes, shortcodes, or cron events that could serve as attack vectors. The absence of known CVEs and a clean vulnerability history further indicate a well-maintained and secure codebase.\n\nHowever, there are areas for improvement. The single SQL query present is not utilizing prepared statements, which poses a moderate risk of SQL injection, especially if user input is directly incorporated into this query. Additionally, a significant portion of output escaping (50%) is not properly implemented, creating a risk of Cross-Site Scripting (XSS) vulnerabilities. The presence of a file operation also warrants attention, though without further context, its specific risk is difficult to assess.\n\nIn conclusion, while the plugin benefits from robust access control on its entry points and a clear history of security, the unescaped outputs and raw SQL query represent tangible vulnerabilities. Addressing these would elevate the plugin's security to a more comprehensive level.",[253,255],{"reason":254,"points":171},"Raw SQL query without prepared statements",{"reason":256,"points":257},"50% of outputs not properly escaped",6,"2026-03-16T17:49:41.832Z",{"wat":260,"direct":270},{"assetPaths":261,"generatorPatterns":265,"scriptPaths":266,"versionParams":267},[262,263,264],"\u002Fwp-content\u002Fplugins\u002Fposts-to-posts\u002Fbox.css","\u002Fwp-content\u002Fplugins\u002Fposts-to-posts\u002Fmustache.js","\u002Fwp-content\u002Fplugins\u002Fposts-to-posts\u002Fbox.js",[],[264],[268,269],"posts-to-posts\u002Fbox.css?ver=","posts-to-posts\u002Fbox.js?ver=",{"cssClasses":271,"htmlComments":274,"htmlAttributes":275,"restEndpoints":280,"jsGlobals":281,"shortcodeOutput":284},[272,273],"p2p-notice","p2p-box",[],[276,277,278,279],"data-p2p_type","data-duplicate_connections","data-cardinality","data-direction",[],[282,283],"P2PAdminL10n","P2P_BOX_NONCE",[]]