From those who are more experienced with WP, I could use some advice on how to best set up a local history site to do the following:

  • There will be a list of articles on different historical topics. Each will be tagged with the people who appear in the article, the organizations discussed, and maybe other metadata like events or places.

  • Each person should have his/her own page that shows all the articles the person is mentioned is, all the organizations the person is a member of, and maybe also all the events they attended or places they lived/frequented.

  • Each organization should list all the people who were its members, and maybe also all the events it threw and places it met.

And so on... I think you get the point... basically I have 3-5 sets of content that need to be tagged to each other in flexible ways.

I'm not sure how best to accomplish this.

  • Out of the box tags and categories don't link to each other (plus it's painful to create custom tag and category pages), though they seem like they ought to be the more natural fit.
  • Then I thought I could create a custom post format for each of the non-article content types (people, orgs, events, places) and then using the plugin Advanced Custom Fields 4.3.8 I could shoe-horn all the tags in there, but that seems pretty hideous, and it's not clear it would even work since it seems to want everything to be 1:1.

I know this isn't the best fit for StackOverflow, but I feel like this use-case isn't so unique that there isn't a clear architectural recommendation or even an existing plugin.

Thanks so much!

  • please define "best" in this context Aug 7, 2014 at 6:07
  • What it means in any context -- closest to requirements, minimally hacky, maximizing use of existing components (whether core functionality or well-maintained plugins), and most consistent with Wordpress' overall architecture to assure compatibility through future upgrades.
    – TAH
    Aug 7, 2014 at 13:42

2 Answers 2


I would create 2 custom post types:

  1. People
  2. Organizations

I would use the default Post post type for the articles (Assuming you're not already using this for a blog or something else).

ACF is my plugin of choice when it comes to custom fields, it allows you to create metaboxes that list all posts under a custom post type. It also allows you to select multiple options.

Under Posts (Articles): I would add one custom field to poll all People

Under People: I would add one custom field to poll all Organizations

This way on the front end you can create a page that lists all Articles, and you would already have the article -> people association formed.

You would also be able to have a page for each person listing all their articles by running a query on all posts that have their name in the relational custom field. people -> articles

And finally you would be able to create a page for all organizations and list the association organization -> peoples

I would reserve custom taxonomies to further filter out results (eg. article type). I find that taxonomies should be used only to classify objects on a shelf, but it should not be the actual object on the shelf.

  • Your last comment about taxonomies vs. objects is especially useful. Yes, I think I was trying to make the tag the object. Still working out the rest, but that particular piece of advice alone is tremendously helpful -- thanks!
    – TAH
    Aug 7, 2014 at 15:57
  • I'm glad I could help. Good luck!
    – gdaniel
    Aug 7, 2014 at 18:18
  • This worked like a charm. One thing I'm stuck on, though, is printing the people tagged in an article on the article page. If I print the_meta() I get JSON: people: a:1:{i:0;s:3:"161";}. Is there a way to get a more readable format? (If I call it get_post_meta, I still end up with an array with just the post ID (Array ( [0] => 161 )) that I would then need to look up…) Thanks!
    – TAH
    Aug 7, 2014 at 19:39
  • If you are using ACF plugin -> echo get_field('FIELD NAME'), or the_field('FIELD NAME') (get_field returns the value) (the_field echoes the value) It also takes the post ID as second parameter, in case you're in a custom loop get_field("FIELD NAME", $post->ID);
    – gdaniel
    Aug 7, 2014 at 19:52
  • Thanks, once again! That did the trick! Though, overall this was much more painful than I expected -- having to differentiate between strings and arrays -- then <a href=\"".get_permalink($value->ID)."\">$value->post_title</a> to do the actual output. I'm surprised there isn't anything out there to pull this all together -- doesn't seem like that unusual a use-case...
    – TAH
    Aug 8, 2014 at 4:44

Then I thought I could create a custom post format for each of the non-article content types (people, orgs, events, places) ...

This is your best option.

Each entity type (person, org, place) will have different attributes so they would fit best in their own post type. Here is a good article on creating them and it suggests using the Custom Post Type UI Plugin as an alternate to making them by hand.

Each custom post type could have taxonomies that linked to other custom post types. For example, a 'person' post type would have an organization attribute that would link to the organization post type. On that page would be a list of people, places, events etc that are associated with the organization.

  • Custom Post Type UI was a huge timesaver -- thank you! Great find. I wish I could pick two "right" answers, since each provided a part of what came together to work for me.
    – TAH
    Aug 8, 2014 at 4:46
  • 1
    No worries @TAH. Glad you got things sorted out.
    – Dan Bough
    Aug 8, 2014 at 11:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.