Ofnoa Marquee — Logo & Text Ticker releasesself-updates
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/lirish1973/ofnoa-marquee/releases/download/v1.0.2/ofnoa-marquee.zipShips its own WordPress updater (built-in updater), so new versions show up under Dashboard → Updates.
Readme
Ofnoa Marquee — Logo & Text Ticker
A professional, fully customizable marquee / ticker plugin for WordPress: scrolling logo walls, news tickers, announcement bars — with real design control and no jQuery on the front end.
Repository:
lirish1973/ofnoa-marquee· License: GPL-2.0-or-later · Requires WP 5.8 · PHP 7.2
Highlights
| Unlimited marquees | Every marquee is its own post — build as many as you need, duplicate any of them in one click. |
| Logos, text or both | Image items, text items, or an image with a label next to it. |
| 4 directions | Right‑to‑left, left‑to‑right, bottom‑to‑top, top‑to‑bottom. |
| 1 / 2 / 3 rows | Extra rows can run in the opposite direction with their own speed and start offset. |
| Constant speed | Speed is set in pixels per second, so adding items never changes how fast it moves. |
| Seamless loop | The content group is measured and cloned just enough times to fill the viewport — no gaps, no jumps. |
| Live preview | See the result while you edit, at desktop / tablet / mobile widths. |
| Per‑device settings | Gap, speed, logo height, font size and item padding each have tablet and mobile values. |
| Dynamic content | Pull the latest posts (any post type) instead of typing items manually. |
| Accessible | Real prefers-reduced-motion support, focus styles, cloned content hidden from screen readers, keyboard focus pauses the animation. |
| Fast | Pure CSS animation on the GPU, ~9 KB of vanilla JS, assets loaded only on pages that actually render a marquee. |
Installation
From a release (recommended)
- Download
ofnoa-marquee.zipfrom the latest release. - WordPress → Plugins → Add New → Upload Plugin.
- Activate. A new Marquee menu appears in the sidebar.
From source
cd wp-content/plugins
git clone https://github.com/lirish1973/ofnoa-marquee.git ofnoa-marquee
Updates
The plugin checks GitHub releases every 6 hours and offers updates through the normal WordPress update screen. You can force a check under Marquee → Tools → Check for updates now, disable checks entirely, or add a token for a private repository.
Usage
Shortcode
[ofnoa_marquee id="123"]
Any setting can be overridden inline:
[ofnoa_marquee id="123" speed="120" direction="right" rows="2" logo_height="80" fade_edges="1"]
[omq id="123"] is a shorter alias.
Gutenberg
Add the Ofnoa Marquee block and pick a marquee. Speed and direction can be overridden per block; the block renders server-side so the editor shows the real thing.
Elementor
Search for Ofnoa Marquee in the General category. The widget exposes the marquee selector plus overrides for direction, rows, speed, gap, logo height, font size, colors, background, edge fade and pause on hover.
PHP
<?php ofnoa_marquee( 123 ); ?>
<?php echo ofnoa_get_marquee( 123, array( 'direction' => 'right', 'speed' => 90 ) ); ?>
Classic widget
Appearance → Widgets → Ofnoa Marquee.
Settings reference
Content — marquee type (logos / text / mixed), manual items or dynamic post query (post type, count, order, link to post).
Layout — direction, rows, extra-row direction / speed / offset / gap, item gap, alignment, full or boxed width, max width, vertical height, padding, margin.
Container style — transparent / solid / gradient background with angle, border width, style, color, radius, shadow presets or a custom shadow, edge fade with size.
Items style — logo height, max width, object-fit, grayscale, opacity, blend mode, hover grayscale / opacity / scale, item background (normal + hover), radius, border, padding, shadow, transition duration.
Text & separator — font family, size, weight, line height, letter spacing, transform, color, hover color, text shadow; separator style (dot, dash, star, line, custom character) with its own color and size.
Animation — speed in px/s, timing function, pause on hover, hover speed, click to pause, start delay, reverse on scroll, scroll speed boost, animate only when visible, fade in, respect reduced motion.
Advanced — link target, rel="nofollow", ARIA label, extra CSS class, hide on
desktop / tablet / mobile, custom breakpoints, z-index, custom CSS with a {{WRAPPER}}
placeholder.
Custom CSS
Inside a marquee's Advanced → Custom CSS, {{WRAPPER}} is replaced with that
instance's ID:
{{WRAPPER}} .omq__item--logo { padding: 0 8px; }
{{WRAPPER}} .omq__text { text-shadow: 0 2px 8px rgba(0,0,0,.2); }
Restyling images
The image geometry (height, width, fit) is enforced with !important, because themes
routinely override plain classes and break the marquee's layout. Change it through the
custom properties rather than by re-declaring the properties:
{{WRAPPER}} { --omq-logo-h: 80px; --omq-logo-maxw: 200px; --omq-logo-fit: cover; }
Markup & hooks
<div id="omq-123-1" class="omq omq--dir-left …" style="--omq-gap:40px; …">
<div class="omq__row omq__row--1">
<div class="omq__viewport">
<div class="omq__track">
<div class="omq__group"><!-- items + separators --></div>
</div>
</div>
</div>
</div>
Every visual value is a CSS custom property (--omq-gap, --omq-logo-h, --omq-color,
--omq-speed, …), so a child theme can restyle a marquee without touching the plugin.
JavaScript API:
window.OfnoaMarquee.initAll( container ); // init marquees added dynamically
window.OfnoaMarquee.refreshAll(); // re-measure after a layout change
window.OfnoaMarquee.destroy( element ); // tear one down
PHP filter:
add_filter( 'omq_field_schema', function ( $schema ) {
$schema['animation']['fields']['speed']['default'] = 100;
return $schema;
} );
Development
ofnoa-marquee.php Bootstrap, constants, asset registration
includes/
class-omq-fields.php Field schema — defaults, admin UI and sanitization in one place
class-omq-post-type.php CPT, admin columns, duplication
class-omq-metabox.php Builder UI, item repeater, AJAX live preview, saving
class-omq-render.php HTML + scoped CSS generation
class-omq-shortcode.php Shortcode and template tags
class-omq-block.php Gutenberg block (server rendered)
class-omq-elementor*.php Elementor widget
class-omq-widget.php Classic widget
class-omq-tools.php Options, import / export
class-omq-updater.php GitHub release updater
assets/css|js|img Front-end and admin assets
Adding a setting means adding one entry to OMQ_Fields::schema() — the admin control,
default value, sanitizer and shortcode attribute all follow automatically. Render it by
mapping the key to a CSS variable in OMQ_Render::inline_vars().
Releasing
push.ps1 does the whole run from Windows — it refuses to push when the version in
ofnoa-marquee.php, OMQ_VERSION and readme.txt disagree, so a release can't go out
half-bumped:
.\push.ps1 # push what is already committed
.\push.ps1 -Message "fix: separator spacing" # commit everything, then push
.\push.ps1 -Zip -Tag -Release # build the ZIP, tag v<version>, publish the release
push.bat is a double-click wrapper for the same thing.
The same flow in bash — Git Bash on Windows, WSL, Linux, macOS:
./push.sh # push what is already committed
./push.sh -m "fix: separator spacing" # commit everything, then push
./push.sh -z -t -r # build the ZIP, tag v<version>, publish the release
./push.sh -n # dry run: print every step, change nothing
push.sh packages from git ls-files, so nothing .gitignore excludes can reach a
release, and it falls back through zip → python3 → PowerShell → Windows bsdtar
so it works even in a bare Git Bash install. None of the push.* files ship inside
the plugin ZIP.
Doing it by hand instead:
# bump the version in ofnoa-marquee.php, readme.txt and CHANGELOG.md first
git tag v1.0.2
git push origin v1.0.2
The GitHub Action builds ofnoa-marquee.zip (correctly nested in an ofnoa-marquee/
folder) and publishes it as a release asset — which is exactly what the in-plugin updater
downloads.
License
GPL-2.0-or-later. See LICENSE.
Read the full README on GitHub →