Someone’s doing it wrong but who?

I’m developing a website for a Golfing Society. They want to be able to define and list their fixtures for 2014. But my shortcode is not producing results.

Requirement/method

Using my new oik-types plugin I defined the new custom post type fixture ( labels “Fixtures” and “Fixture” ). I registered a custom category format that indicates the type of competition, e.g. foursomes, 4BBB (four ball better ball). Custom fields for each fixture include _date, _venue

On the home page I wanted to list the upcoming fixtures displaying the date and event title acting as a link to the details. So using my [bw_pages] shortcode I dutifully wrote the shortcode parameters

post_type=fixture orderby=metakey metakey=_date numberposts=-1 format=_T fields=_date

But nothing appeared. I reduced the shortcode to bw_pages post_type=fixture and that worked. Then I put the format parameter back in and it failed. Then I started problem determination…

Problem determination

  • Can you reproduce it locally? Yes.
  • Are you running the same versions? Yes. My code is the same, but the problem’s occurring on WordPress 3.7.1.
  • Have you got trace output? Yes. get_posts() isn’t returning anything
  • If you change the code does it work? Yes. If I don’t pass the format parameter to get_posts()
  • Have you grepped the code for format. Yes. But there’s nothing obvious.
  • If you enable action tracing can you find out why no data is returned?

and then it dawned on me.

The debug trace of query vars showed format being used as a custom category search, passing the _T as the category value… AND since I’d seen something like this before, I knew that was the problem.

Is there a fix?

Yes. Change the custom category name to “fixture_format”.

Epilogue

With hindsight I should have followed the Top 10 questions to ask when something doesn’t work. In some respects I did, but it took me a lot longer to find the answer than if I’d consulted the stupid question asker who would have asked

Why didn’t you call your new taxonomy ‘competition_format’ or ‘fixture_format’?

Who was doing it wrong?

First I thought it was me… passing shortcode parameters to get_posts(). Then I thought it was WordPress itself … but that’s how query vars is intended to work. So it turns out it was the user – defining a custom category name that’s also being used in code. How was he supposed to know that was wrong?

The moral of the story is:

Name space everything.

Additional notes

  • So that the custom fields don’t get shown in the Custom Fields meta box their names are prefixed with an underscore ( _ ). This is belt and braces; we could simply have de-selected supports ‘custom-fields’ for the fixture post type.
  • The fact that the problem occurred with the latest version of WordPress was a red-herring. I have not only reproduced the problem with previous version but also with passing the same parameter to a completely different shortcode.
  • A previous problem with get_posts() was when I realised I had multiple uses for the id= parameter. In some cases it was being used to set the HTML id= attribute in others to choose the post(s) to display.