Hoppers

Hoppers is a visually polished but emotionally hollow Pixar film that wastes a clever premise on shallow themes and forgettable storytelling.
139916
Starring
Jon Hamm, Bobby Mynihan, Piper Curda
Director
Daniel Chong
Rating
PG
Genre
Adventure, Comedy, Family
Release date
March 6, 2026
Overall Score
Rating Overview
Story/Plot/Script
Visuals/Cinematography
Performance
Direction
Age Appropriate
Parent Appeal
Non-Wokeness
Rating Summary
Hoppers has no real sense of what story it's telling. So, it tells them all at once to little effect. Solid animation and decent pacing will entertain small children. Otherwise, there's no there there.

Direct to video quality, movie theater prices.

In the shimmering labs where science blurs the line between human and wild, a passionate young animal lover discovers a groundbreaking way to “hop” her mind into lifelike robotic creatures—slipping into fur, fins, and feathers to truly understand their hidden world, in Hoppers.

Hoppers REVIEW

Like Disney before it, Pixar was once the Gold Standard for family animation. Films like The Incredibles, most of the Toy Story franchise, and others captured the imagination of young and old alike, tugged at our heartstrings, and gave generations a look at the human condition in a way that only animation can. However, the last few years have seen the once creative giant decline as rapidly as virtually every other film studio. Where their success used to be measured in laurels, now it is measured in mediocrity. "Meh" has become today's center podium.

Hoppers is yet another entry in Hollywood's decades-long stream of unfocused, creatively benign time-filler. It takes no chances, has no voice, and no identity aside from a mildly interesting core concept: what if humans could live among and communicate with animals as one of them? Unfortunately, the elastic around the writers' imagination must have snapped after coming up with this nugget because they decided to shoot thematic scattershot at the screen and hope it would result in a cogent story rather than using it as a foundational concept from which to build. Even then, it's barely a plot device.

When Buzz entered Woody's life, he was forced to completely reevaluate his life. In The Incredibles (one of the greatest superhero movies of all time), Mr. Incredible had to learn to let go of his past and embrace the new adventure his life had become as he saved the world and fought injustice and discrimination. In Hoppers, an angry little girl has to get the highway construction rerouted so she can keep touching grass in her favorite spot.

Hoppers bats around a handful of deeper themes, but they are treated more like accessories rather than foundations. The film gestures toward ideas about environmental stewardship, empathy for animals, and the importance of preserving nature, yet never commits to exploring any of them. They exist largely as convenient plot devices rather than emotional engines for the story. As a result, nothing meaningful is built from them. Characters remain thinly sketched, motivations feel superficial, and the protagonist’s arc barely registers.

Part of the problem is that the central conflict is rooted in something fundamentally small. The young heroine wants to stop a highway project from cutting through a patch of land she enjoys visiting. She does care about the animals and the natural world, but the film frames the fight less as a matter of conviction and more as a matter of personal comfort. She wants to save the space largely because she likes being there. Had the story grounded her struggle in a deeper belief, a genuine moral or philosophical commitment, the film might at least have had a beating heart beneath its message, an obnoxious, leftist beating heart, but a pulse nonetheless.

Pixar itself once showed how to do this well. WALL-E is, on paper, little more than a “save the planet, stop trashing the Earth” parable. But it works because its story is built on loneliness, curiosity, courage, and love. Those emotions drive the narrative, giving the film resonance far beyond its hippy-dippy backdrop. Hoppers never find that kind of emotional center.

Instead, the movie drifts from one mildly amusing encounter to another. A few characters are cute, and there are a couple of chuckles scattered throughout, but the humor rarely lands, and the story wanders more than it builds. Rather than the kind of layered family film Pixar once specialized in — the sort that entertained kids while quietly speaking to adults — Hoppers feels designed almost exclusively for very young viewers.

And that may be the film’s biggest disappointment. Pixar once made animated movies that families watched together because everyone in the room could find something meaningful in them. Hoppers is content to simply occupy children for ninety minutes. It isn’t terrible, but it isn’t memorable either.

For a studio that once set the standard for animated storytelling, that may be the most damning verdict of all.

Parental Notes

PARENTAL NOTES

Important Information for Parents

Our Parental Notes flag the material parents may want to know about before pressing play, including profanity, blasphemy, adult content, extreme violence, frightening intensity, hyper-stimulating sequences, and other family-content concerns.

UNLOCK PARENTAL NOTES.Profanity, blasphemy, adult content, extreme violence, hyper-stimulating intensity, and more.
Woke Report

WOKE REPORT

You're Only Getting Half the Picture.

This section is our site's secret sauce, and what truly separates us from the rest. If you don't read it, you haven't read our review.

Have the filmmakers chosenradical progressive messaging over story?
Unlock the insightsthat could change your viewing experience and protect your family.

James Carrick

James Carrick is a passionate film enthusiast with a degree in theater and philosophy. James approaches dramatic criticism from a philosophic foundation grounded in aesthetics and ethics, offering insight and analysis that reveals layers of cinematic narrative with a touch of irreverence and a dash of snark.

Leave a Review
  1. smajj03 March 6, 2026 at

    In my personal opinion, Tangled and Big Hero 6 were the last great movies Disney Animation put out. I don’t think Pixar has released a great movie since Inside Out. Good movies, sure, but great movies, meh. Sure wish they would get a clue.

    4
    2
  2. relict March 6, 2026 at

    I’m finding the conceit–body transference–to be a troubling one in a children’s film. For a film aimed at adults, it’s interesting, but what are they really trying to get children to think about by bringing it into an animated film?

    1. James Carrick March 6, 2026 at

      Yeah, I know what you mean, but I was really looking for any possible furry propaganda, and it’s just not there. The whole animal/body transference thing is nothing more than a plot device.

  3. MikeZilla777 March 7, 2026 at

    Stupid male spider where female spider explains that this is an arrow

    Strong smart brave women and week coward males

    I didn’t enjoy

    Beavers were cool though. I was tricked by funny beavers to see soften left narrative

  4. OutdoorsHammy March 14, 2026 at

    Could you imagine how mortified Pixar and/or Disney would be if they made a semi-based movie with an interesting storyline and character development where white males weren’t villainized, aspirational masculinity was embraced, respected, empowered, and traditional femininity was celebrated, and timeless values were center stage without any traces of “the message” or pandering to “the modern audience”
    – and then that movie went on to be begrudgingly heralded as best animated movie since circa 2010 and absolutely crush it in box office sales?
    Mortified beyond belief – which is why the feckless executives will never take this risk even though some of them likely want to.

    3
    0
  5. thesheeplewillhavetheirsay March 26, 2026 at

    I didn’t see it; my wife and 9 year old son did. They really liked it.
    I don’t mind the environmentalist angle; I’m arch-rightwing but care about the environment. I do like the “go touch grass” theme.
    My 9 year old would not have known what “flap around and find out” is a takeoff on. So safe there.
    I guess I’ll just say he really enjoyed it and thought it was it funny.

  6. PurpleSanz April 2, 2026 at

    Well, I can’t see the woke report anymore (thanks, James!), so here is mine:

    Ugh… Where do I start?

    Let’s start with the main character: a ‘woman’ that looks 100% like a man (not even a tomboy, 100% A DUDE), your typical transgender/non-binary BS. Of course she is an insufferable radical activist with the most annoying voice, and she will never never NEVER EVER shut up (Imagine Greta Thunberg but 100 times more annoying)!. Of course she has to be the only one that is brave, strong, capable of the impossible, raising her voice, girlbossing her way even above royalty.

    The plot? Jeez, even Ferngully and Guardians of the Galaxy 3 were waaaay more subtle. Yes, MAN is the EVIL destroyer of nature, especially if he is white. Speaking of white, every ‘good’ or non-relevant character is black, brown or female, even male animals are depicted as cowards, non-caring, dumb, or plain evil compared to the females, of course! Why am I not surprised?

    Movies like Avatar show you the issue in a very entertaining way, making you care, making you feel invested. This movie feels like your typical insufferable vegan standing outside your favourite meat restaurant, nagging and yelling at you for being a ‘murderer’.

    No… just NO.

    8
    2
  7. LegoGuru2000 April 6, 2026 at

    Does the message that its ok to take what you want/need without any concern for others because that’s “pond rules”?

    1. Sweet Deals April 6, 2026 at

      I’m refraining from judgment until the film goes to streaming and I can see the whole thing for myself, but I am very concerned about messaging where not only getting what you want is the highest good, but also where taking advantage of others and blithely ignoring or avoiding consequences is a symbol of status and power.

      It’s basically “being cruel and selfish is cool and awesome as long as you get away with it and make yourself look good while doing it”. I despise this type of thinking.

  8. gayandhornydude69 April 14, 2026 at

    leftist propaganda on much cars bad

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  1. SLBrown39 June 27, 2026 at Audience Review Edited
    Worth ItWoke-ishB

    Although the theme is Environmental, there is no Climate Alarmism bashing, it’s pro-habitat conservation. There were positive values portrayed.
    Script was original enough to keep parents as well as kids entertained.
    I don’t remember any woke themes regarding gender ideology

  2. Sweet Deals May 23, 2026 at Audience Review Edited
    Not Worth ItWokeF

    Hoppers is a spooty movie that makes me so angry I could go on and on ranting about how badly its spooty woke thinking has corrupted it.

    In 2017, Moana rescued a sea turtle by bringing it back to the ocean because she’s a kindly young girl who takes pity on helpless creatures. In 2026, Mabel kidnaps a pet turtle from an elementary school classroom because she despises the very idea that schools keep animals as pets where kids can torture them. This is because Mabel is not an animal lover or a nature lover [a Disney Princess, she is not]. Mabel is actually a feral human hater and she uses her obsession with environmental activism to mask her anger and hatred toward people and reframe it as a virtue. She claims she’s upset because nobody cares, and yet, judging by her actions, Mabel doesn’t really care about anyone except herself. Mabel spends most of her screentime making demands, taking things that don’t belong to her and generally being destructive in pursuit of her own goals without really thinking about what others need or even any consideration of her own well-being. She will not lift a finger on her broken arm to help someone else unless she thinks she can coerce the other guy to do what she wants for her. We’re not told why Mabel is angry all the time, but about two-thirds into the film, she subconsciously barfs out the truth: the reason she’s angry all the time is because she is lonely since her family abandoned her and feels helpless to solve her problems. Her anger causes her to make rash decisions, which backfires on her and makes things worse, which makes her feel even more helpless and angrier so she makes even more bad decisions which spiral into a vicious cycle. Unfortunately, despite discovering the truth and confessing to the accusations that she is indeed a liar and a thief who manipulates others in the name of activism, Mabel lacks the capacity for self-reflection necessary to commit herself to positive change or think carefully about her actions. Instead, she essentially says “Humans suck, but let’s pretend we don’t”, and in the end she automatically receives everything she could want while doing next to nothing to prove that she’s earned any of it, as most of the clean-up and subsequent compromising all happens off-screen.

    Meanwhile, Mayor Jerry is a spoot-headed politician who, like Mabel, cares only about his image and will not lift a finger to help others or even protect himself from danger unless it’s to make himself look good. The movie implies that the highway bypass Jerry wants to build is strictly a vanity project meant to bolster his image for his upcoming re-election campaign; Beaverton doesn’t actually have an existing traffic problem and doesn’t really need the bypass. He claims that he chose the site because there were no animals living there, which makes him look good in the eyes of voters, but he’s the one who secretly drove the animals out, and he openly admits what he has done and then plausibly denies it in the same breath. In a better-researched movie, I could have posed plenty of excellent arguments why it’s not a good idea to build a bypass over Mabel’s glade. For one, before the animals were driven out and the river dried up, that glade was a wetland. The surrounding soil might be swampy and not sturdy enough to hold a highway bypass. Plus, wetlands may be connected to a local watershed and high-volume car traffic running through the area might cause exhaust runoff to leach into the groundwater and negatively affect the town’s water quality. Wetlands are also buffer zones for storm drains and paving it over might cause flooding of the surrounding area [for the record, when Mabel broke the huge beaver dam at the end, she was lucky it only put out the raging wildfire and didn’t flood the whole neighborhood]. Also, driving out animals from their natural habitat doesn’t cause them to disappear further into the wilds [unless they’re specially adapted so they can’t live anywhere else]. Animals will find food and shelter wherever they can, even in cities; creatures will take up residence in human homes, wild bears will harass families at outdoor picnics and rats might start operating kitchens at local restaurants. In short, careless land development not only drives animals from habitats but could pose a downstream quality-of-life issue for the humans, too. Was there not even a single environmental engineer or bureaucrat in all of Beaverton at the DNR or the EPA who could have mentioned any of this stuff before the bypass was built? I guess not, because in Beaverton science isn’t about understanding how nature works or how animals behave but about condescending spoot-heads in their spooty white-coat thingies reciting impressive-sounding facts about “keystone species” out of context to so they can sound like they’re all smart and that they think the viewers are stupid.

    Now, before I discuss the beaver George, King of Mammals, I’d like to rewind 30 years back to Disney’s The Lion King. The lion is the King of the Pride Lands, and his role is to uphold the Circle of Life. The Circle of Life is a quasi-religious moral philosophy shared by all animals that recognizes that nature is balanced and everything and everyone has a function within it. It is understood that predatory animals consume prey animals, but there’s a sense of appreciation that says not to take or kill more than you really need, and that different types of animals rely on each other for mutual benefit. Respecting the Circle of Life means that all the animals of the Pride Lands live peacefully in a prosperous high-trust society. Conversely, breaking the Circle of Life causes the Pride Lands to decay into a desolate wasteland where no animals can survive.

    King George is barely a ruler. He was thought incapable of being a king, but the mantle was forced on him. Personality-wise, he’s more like the spooty HR manager of a failing company. His “pond rules” are a poor substitute for the Circle of Life: they’re ultimately meaningless, and animals who follow his spooty “pond rules” are apathetic and have little to no interest in their own survival or any sense of personal agency. George sees that the animals under his dominion are suffering from overcrowding and lack of resources, and he admits that his solutions don’t work, but every time he identifies a problem he subsequently smiles, shrugs it off, claims everything is fine and deflects the issue with positive thinking so he doesn’t have to do anything difficult or unpleasant. When he asks Mabel the Beaver to be his advisor, it’s not because she’s a better ruler than he is but because he’s essentially abdicating a throne he never wanted. The other kings and queens of the other animal kingdoms are no better. Their solution to Mayor Jerry stealing their homes isn’t to cooperate with one another because they all share the same habitat, but to squish Mayor Jerry and blast away the humans with their own technology in a petty act of revenge and power-hunger because murder is quicker, easier and more satisfying than maintaining good relationships with neighbors.

    The unfortunate thing is that this movie could have had a strong message. Mabel’s grandmother says that “it’s hard to be angry when you’re a part of something big”. Empty slogan aside, the lesson she was trying to impart to her enraged granddaughter is that people, and animals, live together as part of a community. The land is a part of you as much as you are a part of it, and your actions affect others just as much as theirs affect you. And if you appreciate the health of your community, you’ll be inclined to take responsibility and care for it. If you take care of your community, and everyone else follows that example, then everyone will prosper in a high-trust society. If Mabel genuinely contributed to her community in a meaningful way, she wouldn’t feel alone or abandoned, she might actually become more capable and confident in herself, and she might make a real friend or two who could give her a very-needed BIG HUG once in a while. The people of Beaverton would show more appreciation for what they have and treat each other with more respect, and Beaverton would be a better place to live for everyone.

    Instead, Hoppers is saturated with the toxic mindset that human beings are awful, apathetic, condescending and selfish spoot-headed guys. It teaches that humans are not stewards of nature that animals depend on for survival, but that humans are equal in rank to dumb animals who don’t care about their own survival and are actually the problem in the world. It teaches that parents and authority figures who should be responsible for children and the rest of society don’t care enough about their children to teach them how to behave like adults. It teaches that even when big problems are staring you in the face and your life may be in danger, if you distract away from it with positive thinking, the problem will either magically disappear or be quickly and easily fixed so no one has to think critically or suffer in the long term. It wants to say something meaningful, but falls short due to its own lazy, careless thinking and unwillingness to probe deep enough into uncomfortable territory long enough to make the necessary impact. It tries to demonstrate the importance of taking responsibility for your community but it collapses under the weight of its own shallowness, apathy and spite.

    There was a time when Pixar was the gold standard of excellence. The creative staff at Pixar took a loving interest in their subject matter and researched it thoroughly to improve their storytelling, and the artistic rendering was a thing of beauty. Nowadays, Cal Arts is synonymous with the spooty homogenized art style where everything looks like a shapeless blob and the stories are about spooty characters in spooty, weak plots because the spooty people who make the movies don’t care enough to tell a truly meaningful story; they only care about satisfying their own egos. As for the ending: every single “new idea” that the scientists proposed on their blackboard has actually been cribbed from a previously existing Pixar film! Because spooty modern Pixar isn’t honoring the legacy of the more creative people that came before them; they’re stealing it.

    Okay, that’s enough rage out of me. I’m going to take a walk down my local nature trail and sit down at the point that overlooks the large, majestic wetland and bird nesting site down below so I can take a moment to calm down and think. Eenh.

  3. LegoGuru2000 April 6, 2026 at Audience Review Edited
    Not Worth ItWokeF

    Hopper is not simply a disporting PIXAR release but a dangerous one. It contains a number if inappropriate to toxic messages that kids who have no critical thinking skills will take in as gospel. The movie is also just boring enough to most adults that they will tune out of the film and onto their phones allowing the film to indoctrinate the kid uninterrupted.

    The films negative to toxic messages include father homes as the norm, parents who abandon their kids as the norm, that as long as what you are doing is about social justice then you can do no wrong. The film is about an animal activist named Mabel who justifies all the damage and destruction she causes in the name of saving the animals. IN addition to the bad messaging from the humans in the film the animals themselves also convey the idea that in life you take what you want/need without any regret or consideration of others. There is no way this was done accidentally or unintentional. This movie feels like psychologists were consulted on how best to brainwash young kids with ideas of social justice and in a way that parents are not so easy to pick up on. Its very alarming and as a parent you either need to watch it for yourself, w/o your phone as a distraction, or if your set on letting your kids watch it then watch it with them closely and pause the film and address with them the bad messaging the film contains,

    WARNING: This is a film targeted at very young kids and at one point towards the end the face of a human is ripped away. Underneath is a robot but with very real looking teeth/mouth, something that could be easily VERY frightening to a young child.

 

 

 

'; win.document.open(); win.document.write(html); win.document.close(); return true; } function escapeHtml(str){ return String(str || '').replace(/[&<>"']/g, function(ch){ return ({'&':'&','<':'<','>':'>','"':'"',"'":'''})[ch] || ch; }); } function renderShareOptionsWindow(win, landscapeUrl, squareUrl, shareUrl, heading){ if (!win || win.closed) return false; var safeHeading = escapeHtml(heading || 'Share options'); var safeLandscape = escapeHtml(landscapeUrl || ''); var safeSquare = escapeHtml(squareUrl || ''); var safeUrl = escapeHtml(shareUrl || ''); // Keep this HTML script-free. A nested script tag inside this inline footer script can break under Cloudflare Rocket Loader. var html = '' + safeHeading + '' + '' + '

' + safeHeading + '

'; win.document.open(); win.document.write(html); win.document.close(); try { var doc = win.document; var btn = doc.getElementById('copyLinkBtn'); var status = doc.getElementById('shareStatus'); var field = doc.getElementById('shareUrlField'); var urlToCopy = String(shareUrl || ''); function setCopied(){ if (status) status.textContent = 'Link copied.'; if (btn) { btn.textContent = 'Copied!'; win.setTimeout(function(){ btn.textContent = 'Copy link'; }, 1500); } } function focusField(){ if (!field) return; field.removeAttribute('readonly'); field.focus(); field.select(); field.setSelectionRange(0, field.value.length); field.setAttribute('readonly','readonly'); } function legacyCopy(text){ var ta = doc.createElement('textarea'); ta.value = text; ta.setAttribute('readonly','readonly'); ta.style.position='fixed'; ta.style.top='0'; ta.style.left='0'; ta.style.opacity='0.01'; ta.style.pointerEvents='none'; doc.body.appendChild(ta); ta.focus(); ta.select(); ta.setSelectionRange(0, ta.value.length); var ok=false; try{ ok=!!doc.execCommand('copy'); }catch(err){} doc.body.removeChild(ta); return ok; } win.__wiowCopyShareLink = async function(){ if (!urlToCopy) { if (status) status.textContent='No share URL available.'; return false; } focusField(); try { if (win.navigator && win.navigator.clipboard && typeof win.navigator.clipboard.writeText === 'function') { await win.navigator.clipboard.writeText(urlToCopy); setCopied(); return false; } } catch(err) {} if (legacyCopy(urlToCopy)) { setCopied(); return false; } if (status) status.textContent='Press Ctrl+C or Cmd+C to copy the selected link.'; focusField(); return false; }; if (btn) btn.addEventListener('click', function(e){ e.preventDefault(); win.__wiowCopyShareLink(); }); var nextBtn = doc.getElementById('nextComboBtn'); if (nextBtn) nextBtn.addEventListener('click', function(e){ e.preventDefault(); if (win.opener && win.opener.__wiowRefreshShareOptions) win.opener.__wiowRefreshShareOptions(win); }); var mainBtn = doc.getElementById('mainComboBtn'); if (mainBtn) mainBtn.addEventListener('click', function(e){ e.preventDefault(); if (win.opener && win.opener.__wiowResetShareOptions) win.opener.__wiowResetShareOptions(win); }); Array.prototype.slice.call(doc.querySelectorAll('.preview-frame img')).forEach(function(img){ img.addEventListener('click', function(){ var overlay=doc.createElement('div'); overlay.className='overlay'; var full=doc.createElement('img'); full.src=img.getAttribute('data-full') || img.src; full.alt='Preview'; overlay.appendChild(full); overlay.addEventListener('click', function(){ overlay.remove(); }); doc.body.appendChild(overlay); }); }); } catch(err) {} return true; } async function buildShareImage(container, options){ options = options || {}; var postId = container.getAttribute('data-post-id'); var sharePage = container.getAttribute('data-share-page'); var kind = (container.getAttribute('data-share-kind') || 'critics').toLowerCase(); var posterUrl = container.getAttribute('data-poster-url') || findPosterUrl(); if (!posterUrl){ posterUrl = ''; } var isRatings = (kind === 'ratings' || kind === 'ratings-admin' || kind === 'ratings-question'); var isAudience = (kind === 'audience' || kind === 'audience-teaser' || kind === 'audience-question'); var action = isRatings ? 'wiow_build_ratings_share_image' : (isAudience ? 'wiow_build_audience_share_image' : 'wiow_build_share_image'); var payload = new URLSearchParams(); payload.append('action', action); payload.append('post_id', String(postId)); payload.append('poster_url', posterUrl); payload.append('share_context', kind); if (options.force) { payload.append('force', '1'); } if (options.reset) { payload.append('reset_combo', '1'); } if (kind === 'ratings-admin') { payload.append('admin', '1'); } if (kind === 'ratings-question' || kind === 'audience-question' || kind === 'critics-question') { payload.append('questions', '1'); payload.append('mode', 'questions'); } if (kind === 'audience-teaser' || kind === 'critics-teaser') { payload.append('mode', 'teaser'); } var res = await fetch('https://worthitorwoke.com/wp-admin/admin-ajax.php', { method: 'POST', credentials: 'same-origin', headers: {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}, body: payload.toString() }); var data = await res.json(); if (!data || !data.success || !data.data){ throw new Error((data && data.data && data.data.message) ? data.data.message : 'Share build failed.'); } return { image_url: data.data.image_url, share_url: data.data.share_url || sharePage, cycle_image_url: data.data.cycle_image_url || '', poster_url: data.data.poster_url || posterUrl || '' }; } async function buildShareSquareImage(container, cycleImageUrl, posterUrl, options){ options = options || {}; var postId = container.getAttribute('data-post-id'); var sharePage = container.getAttribute('data-share-page'); var kind = (container.getAttribute('data-share-kind') || 'critics').toLowerCase(); var isRatings = (kind === 'ratings' || kind === 'ratings-admin' || kind === 'ratings-question'); var isAudience = (kind === 'audience' || kind === 'audience-teaser' || kind === 'audience-question'); var action = isRatings ? 'wiow_build_ratings_share_image_square' : (isAudience ? 'wiow_build_audience_share_image_square' : 'wiow_build_share_image_square'); var payload = new URLSearchParams(); payload.append('action', action); payload.append('post_id', String(postId)); payload.append('share_context', kind); if (kind === 'ratings-admin') { payload.append('admin', '1'); } if (kind === 'ratings-question' || kind === 'audience-question' || kind === 'critics-question') { payload.append('questions', '1'); payload.append('mode', 'questions'); } if (kind === 'audience-teaser' || kind === 'critics-teaser') { payload.append('mode', 'teaser'); } if (cycleImageUrl) { payload.append('cycle_image_url', cycleImageUrl); } if (posterUrl) { payload.append('poster_url', posterUrl); } if (options.force) { payload.append('force', '1'); } if (options.reset) { payload.append('reset_combo', '1'); } var res = await fetch('https://worthitorwoke.com/wp-admin/admin-ajax.php', { method: 'POST', credentials: 'same-origin', headers: {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}, body: payload.toString() }); var data = await res.json(); if (!data || !data.success || !data.data){ throw new Error((data && data.data && data.data.message) ? data.data.message : 'Square share build failed.'); } return { image_url: data.data.image_url, share_url: data.data.share_url || sharePage, cycle_image_url: data.data.cycle_image_url || cycleImageUrl || '', poster_url: data.data.poster_url || posterUrl || '' }; } window.__wiowRefreshShareOptions = async function(win){ if (!wiowCanAdminNext || !window.__wiowLastShareOptionsContext || !window.__wiowLastShareOptionsContext.row) return false; var ctx = window.__wiowLastShareOptionsContext; var row = ctx.row; var heading = ctx.heading || 'Share options'; var targetWin = win || ctx.win; try { renderShareOptionsLoadingWindow(targetWin, heading); var built = await buildShareImage(row, { force:true }); var builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true }); if (!built || !built.image_url || !builtSquare || !builtSquare.image_url) throw new Error('Share build failed.'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: targetWin }; renderShareOptionsWindow(targetWin, built.image_url, builtSquare.image_url, built.share_url || row.getAttribute('data-share-page') || '', heading); } catch(err) { if (targetWin && !targetWin.closed) { var msg = (err && err.message) ? err.message : 'Could not build next combo.'; targetWin.document.open(); targetWin.document.write('

Could not build next combo

' + escapeHtml(msg) + '

'); targetWin.document.close(); } } return false; }; window.__wiowResetShareOptions = async function(win){ if (!wiowCanAdminNext || !window.__wiowLastShareOptionsContext || !window.__wiowLastShareOptionsContext.row) return false; var ctx = window.__wiowLastShareOptionsContext; var row = ctx.row; var heading = ctx.heading || 'Share options'; var targetWin = win || ctx.win; try { renderShareOptionsLoadingWindow(targetWin, heading); var built = await buildShareImage(row, { force:true, reset:true }); var builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true, reset:true }); if (!built || !built.image_url || !builtSquare || !builtSquare.image_url) throw new Error('Share build failed.'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: targetWin }; renderShareOptionsWindow(targetWin, built.image_url, builtSquare.image_url, built.share_url || row.getAttribute('data-share-page') || '', heading); } catch(err) { if (targetWin && !targetWin.closed) { var msg = (err && err.message) ? err.message : 'Could not build main combo.'; targetWin.document.open(); targetWin.document.write('

Could not build main combo

' + escapeHtml(msg) + '

'); targetWin.document.close(); } } return false; }; // Unified capture-phase share handler. Chrome incognito can allow the visual // pointer animation while another script prevents the later bubbling click // handler from ever running. Handle all top-level share buttons here first. document.addEventListener('click', async function(e){ var targetEl = e.target && e.target.nodeType === 1 ? e.target : (e.target && e.target.parentElement ? e.target.parentElement : null); var btn = targetEl && targetEl.closest ? targetEl.closest('.wiow-share-btn') : null; if (!btn) return; // Ignore the Audience modal "Rate" button (it also has wiow-share-btn class in your CSS usage) if (btn.hasAttribute('data-wiow-audience-open')) return; var row = btn.closest('[data-wiow-share="1"], .wiow-share-row'); if (!row) return; var platform = btn.getAttribute('data-platform'); // Public top-level controls must work even when AJAX generation or membership-gated data is unavailable. // Options still uses the full image-builder path below. if (platform === 'x' || platform === 'link') { e.preventDefault(); e.stopPropagation(); var quickStatus = row.querySelector('.wiow-share-status'); var quickUrl = btn.getAttribute('data-copy-url') || row.getAttribute('data-share-page') || row.getAttribute('data-post-url') || wiowShareFallbackUrl(row); if (!quickUrl) { if (quickStatus) quickStatus.textContent = 'No share URL available.'; return; } if (platform === 'x') { openPopup(btn.getAttribute('href') || btn.getAttribute('data-wiow-x-intent') || wiowShareXIntentUrl(row)); if (quickStatus) quickStatus.textContent = ''; return; } if (quickStatus) quickStatus.textContent = 'Copying link…'; var copiedQuick = await wiowCopyShareText(quickUrl); var quickLabel = btn.querySelector('.wiow-share-btn__label'); var quickOriginal = quickLabel ? quickLabel.textContent : 'Copy link'; if (copiedQuick) { if (quickStatus) quickStatus.textContent = 'Link copied.'; if (quickLabel) { quickLabel.textContent = 'Copied!'; window.setTimeout(function(){ quickLabel.textContent = quickOriginal || 'Copy link'; }, 1500); } } else { if (quickStatus) quickStatus.textContent = 'Could not copy link.'; } return; } e.preventDefault(); var previewWin = null; if (platform === 'copy') { previewWin = openShareOptionsWindow(); var preloadKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var preloadHeading = (preloadKind === 'audience' || preloadKind === 'audience-teaser' || preloadKind === 'audience-question') ? 'Audience share options' : ((preloadKind === 'ratings' || preloadKind === 'ratings-admin' || preloadKind === 'ratings-question') ? 'Ratings share options' : 'Critic share options'); renderShareOptionsLoadingWindow(previewWin, preloadHeading); } var statusEl = row.querySelector('.wiow-share-status'); if (statusEl) statusEl.textContent = (platform === 'link') ? 'Copying link…' : 'Preparing share…'; try { var publicShareUrl = wiowShareFallbackUrl(row); var publicPostTitle = (row.getAttribute('data-post-title') || '').trim(); if (!publicPostTitle) publicPostTitle = 'this'; var publicShareKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var publicUpperTitle = publicPostTitle.toUpperCase(); var publicLineTwo = (publicShareKind === 'audience' || publicShareKind === 'audience-teaser' || publicShareKind === 'audience-question') ? 'See what the audience is saying.' : ((publicShareKind === 'ratings' || publicShareKind === 'ratings-admin' || publicShareKind === 'ratings-question') ? 'See the Worth it or Woke score.' : 'See what sane critics say.'); var publicBaseText = 'Is ' + publicUpperTitle + ' Worth it or Woke?\n\n' + publicLineTwo + '\n\nFollow @worthitorwoke for more.'; // Public top-level X and Copy Link controls should not depend on AJAX image generation. // The share URL itself carries the OG/Twitter metadata; scrapers can generate/fetch the image from that URL. if ((platform === 'x' || platform === 'link') && publicShareUrl) { if (platform === 'link') { var copiedPublicLink = await wiowCopyShareText(publicShareUrl); var publicLabel = btn.querySelector('.wiow-share-btn__label'); var publicOriginalLabel = publicLabel ? publicLabel.textContent : ''; if (copiedPublicLink) { if (statusEl) statusEl.textContent = 'Link copied.'; if (publicLabel) { publicLabel.textContent = 'Copied!'; window.setTimeout(function(){ publicLabel.textContent = publicOriginalLabel || 'Copy link'; }, 1500); } } else { if (statusEl) statusEl.textContent = 'Could not copy link.'; } return; } openPopup('https://twitter.com/intent/tweet?text=' + encodeURIComponent(publicBaseText) + '&url=' + encodeURIComponent(publicShareUrl)); if (statusEl) statusEl.textContent = ''; return; } var built; var builtSquare = null; if (platform === 'copy') { // Build the landscape first so it chooses exactly one featured/gallery cycle image, // then pass that same image to the square builder. This prevents two square // outputs or mismatched gallery states in the Share Options window. built = await buildShareImage(row, { force:true }); builtSquare = await buildShareSquareImage(row, built.cycle_image_url || '', built.poster_url || '', { force:true }); if (!built || !built.image_url) { throw new Error('Landscape share build failed.'); } if (!builtSquare || !builtSquare.image_url) { throw new Error('Square share build failed.'); } } else { built = await buildShareImage(row); } var shareUrl = built.share_url; var postUrl = (row.getAttribute('data-post-url') || '').trim() || shareUrl; var postTitle = (row.getAttribute('data-post-title') || '').trim(); if (!postTitle) postTitle = 'this'; var shareKind = (row.getAttribute('data-share-kind') || 'critics').trim().toLowerCase(); var upperTitle = postTitle.toUpperCase(); var lineTwo = (shareKind === 'audience' || shareKind === 'audience-teaser' || shareKind === 'audience-question') ? 'See what the audience is saying.' : ((shareKind === 'ratings' || shareKind === 'ratings-admin' || shareKind === 'ratings-question') ? 'See the Worth it or Woke score.' : 'See what sane critics say.'); var baseText = 'Is ' + upperTitle + ' Worth it or Woke?\n\n' + lineTwo + '\n\nFollow @worthitorwoke for more.'; var textWithUrl = baseText + '\n\n' + shareUrl; var postTextWithUrl = baseText + '\n\n' + postUrl; var encodedUrl = encodeURIComponent(shareUrl); var encodedBaseText = encodeURIComponent(baseText); var encodedTextWithUrl = encodeURIComponent(textWithUrl); if (platform === 'link') { var copiedLink = await wiowCopyShareText(shareUrl); var label = btn.querySelector('.wiow-share-btn__label'); var originalLabel = label ? label.textContent : ''; if (copiedLink) { if (statusEl) statusEl.textContent = 'Link copied.'; if (label) { label.textContent = 'Copied!'; window.setTimeout(function(){ label.textContent = originalLabel || 'Copy link'; }, 1500); } } else { if (statusEl) statusEl.textContent = 'Could not copy link.'; } return; } if (platform === 'x'){ // X gets the URL through the intent URL parameter, so do not also duplicate it in the tweet text. openPopup('https://twitter.com/intent/tweet?text=' + encodedBaseText + '&url=' + encodedUrl); } else if (platform === 'facebook'){ // Facebook sharing has been intentionally removed from this plugin flow. if (statusEl) statusEl.textContent = 'Facebook sharing is currently disabled.'; } else if (platform === 'copy'){ var heading = (shareKind === 'audience' || shareKind === 'audience-teaser' || shareKind === 'audience-question') ? 'Audience share options' : ((shareKind === 'ratings' || shareKind === 'ratings-admin' || shareKind === 'ratings-question') ? 'Ratings share options' : 'Critic share options'); window.__wiowLastShareOptionsContext = { row: row, heading: heading, win: previewWin }; var shown = renderShareOptionsWindow(previewWin, built.image_url, (builtSquare ? builtSquare.image_url : ''), shareUrl, heading); if (!shown) { var copied = false; if (navigator.clipboard && window.isSecureContext && navigator.clipboard.writeText){ try { await navigator.clipboard.writeText(shareUrl); copied = true; } catch (copyErr) {} } if (!copied) { var ta = document.createElement('textarea'); ta.value = shareUrl; ta.setAttribute('readonly', 'readonly'); ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta); ta.focus(); ta.select(); ta.setSelectionRange(0, ta.value.length); copied = !!document.execCommand('copy'); ta.remove(); } } } if (statusEl) statusEl.textContent = (platform === 'copy') ? 'Ready.' : ''; } catch(err){ if (previewWin && !previewWin.closed) { previewWin.close(); } if (statusEl) statusEl.textContent = (err && err.message) ? err.message : 'Could not share.'; } }, true); })();