Querying

Querying Entries with Engagement

Engagement lets you query entries by Rating, Likes/Dislikes, and Favorites metrics directly from your field handle on an element query. This keeps queries Craft-native and easy to compose with other entry filters.

Basic pattern:

{% set results = craft.entries()
  .myFieldHandle({
    /* criteria */
  })
  .all() %}

How It Works

Each Engagement field handle accepts a criteria object. You can combine Engagement criteria with normal Craft query methods like section, site, orderBy, limit, and relatedTo.

{% set entries = craft.entries()
  .section('articles')
  .myRatingField({
    minAverage: 4,
    minVoteCount: 10
  })
  .limit(12)
  .all() %}

Shared Criteria (All Engagement Fields)

KeyTypeDescription
enabledbooleanFilters by the effective enabled state for that field on each entry.
siteIdintFilters metrics using a specific site context.

Rating Criteria Keys

KeyTypeDescription
minAveragenumberMinimum average rating.
maxAveragenumberMaximum average rating.
minVoteCountintMinimum number of rating votes.
maxVoteCountintMaximum number of rating votes.
hasVotesbooleantrue = voteCount > 0, false = voteCount = 0.
{% set topRated = craft.entries()
  .myRatingField({
    minAverage: 4.2,
    minVoteCount: 25,
    hasVotes: true
  })
  .all() %}

Likes/Dislikes Criteria Keys

KeyTypeDescription
minLikesintMinimum like count.
maxLikesintMaximum like count.
minDislikesintMinimum dislike count.
maxDislikesintMaximum dislike count.
minTotalVotesintMinimum total votes (likes + dislikes).
maxTotalVotesintMaximum total votes (likes + dislikes).
totalVotesintExact total votes shorthand.
minScoreintMinimum score (likes - dislikes).
maxScoreintMaximum score (likes - dislikes).
scoreintExact score shorthand.
{% set controversial = craft.entries()
  .myLikesField({
    minLikes: 20,
    minDislikes: 20,
    minTotalVotes: 50
  })
  .all() %}
{% set highlyPositive = craft.entries()
  .myLikesField({
    minTotalVotes: 30,
    minScore: 20
  })
  .all() %}

Favorites Criteria Keys

KeyTypeDescription
minFavoritesintMinimum favorite count.
maxFavoritesintMaximum favorite count.
hasFavoritesbooleantrue = favoriteCount > 0, false = favoriteCount = 0.
{% set mostSaved = craft.entries()
  .myFavoritesField({
    minFavorites: 15,
    hasFavorites: true
  })
  .all() %}

Sorting by Engagement Metrics

Use orderBy() with field-handle sort tokens:

ratings: <handle>__average, <handle>__voteCount

likes: <handle>__likes, <handle>__dislikes, <handle>__score, <handle>__totalVotes

favorites: <handle>__count

{% set trending = craft.entries()
  .section('news')
  .myRatingField({ minVoteCount: 10 })
  .orderBy('myRatingField__average desc, postDate desc')
  .all() %}
{% set mostLiked = craft.entries()
  .myLikesField({ minTotalVotes: 25 })
  .orderBy('myLikesField__score desc')
  .all() %}
{% set mostFavorited = craft.entries()
  .myFavoritesField({ hasFavorites: true })
  .orderBy('myFavoritesField__count desc')
  .all() %}