The wp_term_relationships table is used to associate WordPress posts, pages, or any custom post type with the terms from the wp_terms and wp_term_taxonomy tables.
Each row stores an object_id (post or page ID), term_taxonomy_id (identifying the term), and term_order in which the associated terms are displayed for the object.
Columns
object_id: This column stores the unique identifier for the object that is being associated with a term. The object can be a post, page, or any custom post type in WordPress. This value corresponds to the ID column in the wp_posts table. For example, if you have a post with an ID of 123, and you associate it with a term with a term_taxonomy_id of 456, then you would see a row in the wp_term_relationships table with object_id of 123 and term_taxonomy_id of 456.
term_taxonomy_id: This column stores the unique identifier for the term. This value corresponds to the term_taxonomy_id column in the wp_term_taxonomy table. It is not the term_id from wp_terms table, which may be a bit confusing.
term_order: This column stores the order in which terms are displayed for a particular object (e.g. post). This value is an integer, with lower values indicating a higher priority (displayed first). For example, if you have a post that is associated with multiple categories, you can use the term_order value to control the order in which the categories are displayed.
Example
For example, let's say you have a blog with multiple categories, including "News", "Recipes", and "Tips & Tricks".
You create a new post, which gets post ID of 135 in wp_posts table. You assign this new post to the "News" and "Recipes" categories.
WordPress creates a new row in the wp_term_relationships table with object_id = 135 (the post ID), term_taxonomy_id = the "News" category's term_taxonomy_id, and term_order = 1 (since "News" is the first category assigned to the post).
Another row is created with object_id = 135 (still the same post ID), term_taxonomy_id = "Recipes" category term_taxonomy_id, and term_order = 2 (since "Recipes" is the second category assigned to the post).
When the post is displayed on the front-end, the categories will be displayed in the order specified by the term_order value: "News", "Recipes".
SQL Schema
CREATE TABLE `wp_term_relationships` (
`object_id` bigint(20) unsigned NOT NULL DEFAULT 0,
`term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT 0,
`term_order` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`object_id`,`term_taxonomy_id`),
KEY `term_taxonomy_id` (`term_taxonomy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;