If you know the IDs of some items, you can fetch and template these items in a specific order using MySQL’s
Note this does not work with all types of content. It only works if the function queries a database table that has the field you are filtering by as a column (e.g.
perch_categories()). So this does not work with content regions (
perch_content_custom()) or collections (
perch_collection()) as they deal with a more flexible tables structures to allow for filtering by custom fields.
Besides categories, I find this is useful when fetching items from custom Perch apps that I built.
You need to know the IDs (or the value of another unique field). You may get the IDs when fetching another set of items, or from a third-party source. For demonstration, let’s just have an array of category IDs:
$categoryIDs = [12, 6, 8, 22, 9];
To output these categories specifying the order, we can filter on the
perch_categories([ 'filter' => 'catID', 'match' => 'in', 'value' => implode(',', $categoryIDs), ]);
The PHP function implode() glues the array elements together with a given string. In this case we are joining the elements with a comma
, so we get the following string:
So if we are to hardcode the filter, it will be:
perch_categories([ 'filter' => 'catID', 'match' => 'in', 'value' => '12,6,8,22,9', ]);
Now we can use the
FIELD() function in the
$gluedCategoryIDs = implode(',', $categoryIDs); perch_categories([ 'filter' => 'catID', 'match' => 'in', 'value' => $gluedCategoryIDs, 'sort' => "FIELD(catID,$gluedCategoryIDs)", // use double quotes to allow variable interpolation ]);
perch_categories([ 'filter' => 'catID', 'match' => 'in', 'value' => '12,6,8,22,9', 'sort' => "FIELD(catID,12,6,8,22,9)", ]);