{"id":368325,"date":"2026-09-17T09:22:27","date_gmt":"2026-09-17T09:22:27","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/qaiyo-content-slider\/"},"modified":"2026-09-23T18:34:55","modified_gmt":"2026-09-23T18:34:55","slug":"qaiyo-content-slider","status":"publish","type":"plugin","link":"https:\/\/arq.wordpress.org\/plugins\/qaiyo-content-slider\/","author":23510315,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.0","stable_tag":"1.3.0","tested":"7.1.2","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Qaiyo Content Slider","header_author":"Qaiyo","header_description":"SEO and AI-friendly content slider with real image and text markup: five layouts including a partner logo wall, Ken Burns, video backgrounds, dynamic post and HappyFiles sources, shortcode and block.","assets_banners_color":"","last_updated":"2026-09-23 18:34:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/qaiyo-plugins.com\/plugins\/","header_author_uri":"https:\/\/qaiyo-plugins.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":242,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"qaiyo","date":"2026-09-18 11:46:33","revision":3701900},"1.0.1":{"tag":"1.0.1","author":"qaiyo","date":"2026-09-18 13:12:46","revision":3702035},"1.1.0":{"tag":"1.1.0","author":"qaiyo","date":"2026-09-22 16:54:31","revision":3707796},"1.2.0":{"tag":"1.2.0","author":"qaiyo","date":"2026-09-23 17:13:22","revision":3709829},"1.3.0":{"tag":"1.3.0","author":"qaiyo","date":"2026-09-23 18:34:55","revision":3709966}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"qaiyo\/content-slider":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"qaiyo\/content-slider","title":"Qaiyo Content Slider","category":"widgets","icon":"images-alt2","description":"Insert a saved Qaiyo Content Slider.","keywords":["slider","carousel","banner","hero","qaiyo"],"textdomain":"qaiyo-content-slider","supports":{"html":false,"align":["wide","full"]},"attributes":{"id":{"type":"integer","default":0},"autoplay":{"type":"string","default":""},"speed":{"type":"integer","default":0},"transition":{"type":"string","default":""},"layout":{"type":"string","default":""},"height":{"type":"integer","default":0},"ken_burns":{"type":"string","default":""}},"editorScript":"file:.\/edit.js"}},"tagged_versions":["1.0.0","1.0.1","1.1.0","1.2.0","1.3.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Overlay layout with a left text box and progress indicators.","2":"The visual wireframe layout picker (Overlay, Side by side, Stacked, Carousel).","3":"Carousel layout: the active card is centered with the next ones peeking in.","4":"The slide editor with static, single-post and dynamic (CPT query) sources.","5":"The Overview screen with quick actions and the layout gallery."}},"plugin_section":[],"plugin_tags":[784,786,210,27923,611],"plugin_category":[50],"plugin_contributors":[267332],"plugin_business_model":[],"class_list":["post-368325","plugin","type-plugin","status-publish","hentry","plugin_tags-banner","plugin_tags-carousel","plugin_tags-gallery","plugin_tags-hero","plugin_tags-slider","plugin_category-media","plugin_contributors-qaiyo","plugin_committers-qaiyo"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/qaiyo-content-slider.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Qaiyo Content Slider builds hero-banner style slides: a background image (or video) plus a text box (heading, text, call-to-action button), with progress indicators, prev\/next arrows and a pause\/play control.<\/p>\n\n<h4>Five layouts<\/h4>\n\n<p>Pick a layout per slider with a visual wireframe picker:<\/p>\n\n<ul>\n<li><strong>Overlay<\/strong> \u2014 a floating text box over a full-bleed image.<\/li>\n<li><strong>Side by side<\/strong> \u2014 image and text in two columns (landscape).<\/li>\n<li><strong>Stacked<\/strong> \u2014 image on top, text below (portrait).<\/li>\n<li><strong>Carousel<\/strong> \u2014 a centered card with the neighbours peeking in at the sides.<\/li>\n<li><strong>Logo wall<\/strong> \u2014 the classic \"Our partners\" strip: logos gliding past in one or two rows.<\/li>\n<\/ul>\n\n<h4>Logo wall<\/h4>\n\n<p>A partner or client strip that keeps moving without feeling busy:<\/p>\n\n<ul>\n<li>One or two rows, running to the left or to the right \u2014 and, with two rows, optionally in opposite directions.<\/li>\n<li>Speed in pixels per second, so the pace stays the same however many logos you add.<\/li>\n<li>Faded edges, a shared logo height that evens out mismatched logos, and an adjustable gap.<\/li>\n<li>Every logo can link to the partner's site (or an anchor on the same page), optionally in a new tab.<\/li>\n<li>A slide without an image shows its name as a word-mark.<\/li>\n<li>Optionally blend the strip into the background (multiply), so the white box JPEG logos usually carry disappears and only the logos show \u2014 best on a light background.<\/li>\n<li>Add a whole folder of logos in one go: \"Add several images\" turns every selected image into its own slide.<\/li>\n<li>Each logo is in the page exactly once, as a real list of <code>&lt;img&gt;<\/code> and <code>&lt;a&gt;<\/code> elements, with an optional Schema.org list of Organizations \u2014 the moving copies are generated in the browser and hidden from screen readers and the keyboard.<\/li>\n<li>A row stops while it is pointed at or has keyboard focus; visitors who prefer reduced motion get a still, centred row instead.<\/li>\n<\/ul>\n\n<h4>Built for SEO and AI search<\/h4>\n\n<p>Unlike most slider plugins, every slide image is a real <code>&lt;img&gt;<\/code> tag (never a CSS background), and every heading\/text\/button is plain DOM text \u2014 never baked into the image. That means:<\/p>\n\n<ul>\n<li>Slide images stay indexable by Google Image Search.<\/li>\n<li>The first slide loads eagerly with <code>fetchpriority=\"high\"<\/code>; the rest load lazily.<\/li>\n<li>Content is fully visible to screen readers, search engine crawlers and AI agents that don't execute JavaScript.<\/li>\n<li>Slide headings use a configurable H1, H2 or H3 tag, or styled text \u2014 never a forced H1. Choose H1 and only the first slide's heading becomes the H1 (the rest are H2), so a page never ends up with several.<\/li>\n<li>Optional Schema.org <code>ItemList<\/code> JSON-LD output.<\/li>\n<\/ul>\n\n<h4>Dynamic content sources (Free)<\/h4>\n\n<p>Each slide can be:<\/p>\n\n<ul>\n<li><strong>Static<\/strong> \u2014 manually written heading, text, image and button.<\/li>\n<li><strong>A specific post or page<\/strong> \u2014 title, excerpt, featured image and link are pulled live, so editing the source content keeps the slide in sync.<\/li>\n<li><strong>Latest posts from any post type<\/strong> \u2014 pick a post type (and optionally a taxonomy term), and a slide is generated automatically for each of the latest N matching posts.<\/li>\n<li><strong>A HappyFiles folder (live)<\/strong> \u2014 with the HappyFiles media-folder plugin active, point a slide at a folder and every image in it becomes a slide, live: drop a new partner logo into the folder and it appears on the logo wall, no slider editing needed. Each image fills its slide from its own Media Library fields \u2014 alt text (or title) as the name, caption as the heading, description as the text \u2014 and a new \"Slider link\" field on every image gives it a link. The \"Add HappyFiles folder\" button under Slides adds such a slide in one step: pick the folder and the order its images should follow (newest or oldest first, by name, Media Library order, random, or the order dragged into place in HappyFiles Pro), done.<\/li>\n<\/ul>\n\n<h4>Design controls<\/h4>\n\n<p>Box background color, font family, font size, font color and separate heading and description colours are configurable both globally (Settings page) and per slide. The corner radius and the duration of the fade \/ slide transition can be set per slider. Box position, autoplay speed, transition (fade\/slide), a separate mobile height, an extra CSS class on the wrapper, and which controls (arrows, indicators, pause button) are shown can all be set per slider and overridden per shortcode\/block instance.<\/p>\n\n<h4>Motion &amp; media<\/h4>\n\n<ul>\n<li><strong>Ken Burns effect<\/strong> \u2014 a subtle, continuous zoom\/pan on the active slide's image.<\/li>\n<li><strong>Video backgrounds<\/strong> \u2014 add a muted, looping MP4\/WebM per slide; the image is used as the poster and as the reduced-motion fallback.<\/li>\n<li><strong>Autoplay progress indicator<\/strong> \u2014 the active bar fills in sync with the autoplay timer.<\/li>\n<li>All motion honours the visitor's <code>prefers-reduced-motion<\/code> setting.<\/li>\n<\/ul>\n\n<h4>Authoring<\/h4>\n\n<ul>\n<li>Visual wireframe layout picker in the editor.<\/li>\n<li>Duplicate any slide, or duplicate a whole slider from the list.<\/li>\n<li>An Overview screen with quick actions and a layout gallery.<\/li>\n<\/ul>\n\n<h4>Shortcode<\/h4>\n\n<pre><code>[qaiyo_content_slider id=\"123\"]\n<\/code><\/pre>\n\n<h4>Gutenberg block<\/h4>\n\n<p>A \"Qaiyo Content Slider\" block lets you pick a saved slider from a dropdown, with a live preview in the editor.<\/p>\n\n<h4>Multilingual<\/h4>\n\n<p>Fully translation-ready (text domain <code>qaiyo-content-slider<\/code>), with locale variant fallback. Translations are provided through translate.wordpress.org. Compatible with Polylang, WPML, TranslatePress and Loco Translate.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin can optionally load a font from Google Fonts if you choose one of the \"(Google Fonts)\" entries in the font family dropdown (Settings, or a slider's\/slide's font override). When you do, the browser of any visitor viewing that slider loads a stylesheet from <code>https:\/\/fonts.googleapis.com\/css2<\/code> (Google Fonts), which means Google receives the visitor's IP address and user agent. No font is requested if you only use the web-safe font options (Theme default, System UI, Georgia, Courier New). See Google's Privacy Policy: https:\/\/policies.google.com\/privacy and Terms of Service: https:\/\/policies.google.com\/terms.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the Plugins menu.<\/li>\n<li>Create a slider under Content Sliders in the admin menu.<\/li>\n<li>Place the shortcode <code>[qaiyo_content_slider id=\"123\"]<\/code> on any page, or insert the Gutenberg block.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20i%20use%20my%20own%20cpt%20as%20a%20slide%20source%3F\"><h3>Can I use my own CPT as a slide source?<\/h3><\/dt>\n<dd><p>Yes \u2014 the \"Latest posts from a post type\" source works with any public post type, including custom post types.<\/p><\/dd>\n<dt id=\"does%20it%20require%20acf%20or%20meta%20box%3F\"><h3>Does it require ACF or Meta Box?<\/h3><\/dt>\n<dd><p>No. Free dynamic sources use core WordPress fields (title, excerpt, featured image, permalink) only.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20happyfiles%3F\"><h3>Does it work with HappyFiles?<\/h3><\/dt>\n<dd><p>Yes \u2014 tested with HappyFiles Pro 1.9.1. With HappyFiles active, \"HappyFiles folder (live)\" appears as a slide source, and an \"Add HappyFiles folder\" button sits next to \"Add several images\" \u2014 pick a folder and its slide is ready. The folders are listed in the order you arranged them in HappyFiles, and you choose what order the folder\u2019s images run in when you add it. The folder's images (its sub-folders included) are read when the page is rendered, so the slider always matches the folder. With HappyFiles Pro's custom order switched on, the images can follow the order you dragged them into inside the folder. Set each image's link in the Media Library with the \"Slider link\" field. If HappyFiles is deactivated, the folder slide simply shows nothing until it is back \u2014 its settings are kept.<\/p><\/dd>\n<dt id=\"which%20layout%20should%20i%20use%3F\"><h3>Which layout should I use?<\/h3><\/dt>\n<dd><p>Overlay is the classic hero banner. Use Side by side or Stacked when the image and text should sit in separate panels. Carousel shows a centered card with the neighbouring slides peeking in at the sides.<\/p><\/dd>\n<dt id=\"can%20slides%20use%20a%20video%20background%3F\"><h3>Can slides use a video background?<\/h3><\/dt>\n<dd><p>Yes. On a static slide, pick a video (MP4\/WebM) in the media library; it plays muted on loop over the image. Keep files small \u2014 the image is still used as the poster and as the fallback for visitors who prefer reduced motion.<\/p><\/dd>\n<dt id=\"is%20it%20accessible%3F\"><h3>Is it accessible?<\/h3><\/dt>\n<dd><p>Yes. The slider is a labelled carousel region with keyboard navigation, focus management, <code>aria-controls<\/code> on the controls and a polite live region that announces the current slide on manual navigation. All animation is disabled under <code>prefers-reduced-motion<\/code>.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>No jQuery and no page-builder runtime are loaded on the front end \u2014 just one small vanilla-JS file and one stylesheet. The first slide image is eager-loaded with <code>fetchpriority=\"high\"<\/code>; the rest are lazy-loaded.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.0<\/h4>\n\n<p>Security and reliability:<\/p>\n\n<ul>\n<li><strong>A password-protected post can no longer leak through a slider.<\/strong> A slide that pulls in a post (or the \"latest posts\" source) fell back to trimming the post's own body text when it had no excerpt \u2014 and that fallback did not ask whether the post was protected, so the protected text was published to every visitor. Protected posts are now left out entirely.<\/li>\n<li><strong>The view counter no longer stops counting behind a page cache.<\/strong> It used a security token printed into the page, which goes stale once the page is cached and silently ended the counting. Counting now runs through a small public endpoint that needs no token, and every request is still checked: only a published slider, and only a slide that slider actually has.<\/li>\n<li><strong>The counter can no longer be inflated with made-up slides.<\/strong> Anyone could previously send any slide name and have it stored, growing the slider's stored counts without limit. Unknown slide names are now refused.<\/li>\n<li>Simultaneous visitors no longer overwrite each other's views: a count that loses the race is retried instead of dropped.<\/li>\n<li>Your own visits while logged in as an editor of the slider are not counted, and no request is sent at all \u2014 so figures stay clean while you work on the page.<\/li>\n<li>Known crawlers and monitoring bots are left out of the counts.<\/li>\n<\/ul>\n\n<p>Fixes:<\/p>\n\n<ul>\n<li>The Import screen's file field now has a label, so a screen reader announces what it is.<\/li>\n<li>Resetting a slider's view counts now verifies it really is a slider first.<\/li>\n<\/ul>\n\n<p>Under the hood:<\/p>\n\n<ul>\n<li>Unit tests (PHPUnit 9 + Brain Monkey) covering the slide allowlist, the settings sanitiser, the view counter and the source resolver, plus static analysis at PHPStan level 5. Development tooling lives outside the plugin folder, so what ships is only what runs.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<p>Fixes:<\/p>\n\n<ul>\n<li>Slide editor: the per-slide button colours are no longer offered on a layout that draws no button (the Pro mosaic and bento grid make the whole tile the link).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<p>New:<\/p>\n\n<ul>\n<li>Bulk remove in the slide editor: tick the slides you want gone (or \"Select all\") and remove them in one step, instead of one at a time.<\/li>\n<li>The \"Add HappyFiles folder\" dialog now asks what order the folder's images should follow \u2014 newest or oldest first, by name A\u2013Z or Z\u2013A, Media Library order, random, or the order dragged into place in HappyFiles Pro.<\/li>\n<li>The open\/close arrow on a slide card is large enough to hit comfortably.<\/li>\n<\/ul>\n\n<p>Fixes:<\/p>\n\n<ul>\n<li>Uninstalling with \"remove data\" switched on now clears everything the plugin stored: the database version marker, the \"Slider link\" field on images and the plugin-directory cache went untouched before. On a network every site is cleaned up, not only the one uninstalling \u2014 each site still decides for itself through its own setting.<\/li>\n<li>Internal: dead <code>class_exists()<\/code> guards around the plugin's own always-loaded classes removed, and return types declared on the functions whose result is unambiguous (hook callbacks keep their open signature, since a filter has to pass back whatever it was given).<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<p>Fixes:<\/p>\n\n<ul>\n<li>Sliders no longer start their JavaScript inside a page builder's editing canvas (Bricks, Elementor, Oxygen, Beaver, Brizy, WPBakery, Divi). A slider that autoplays and re-lays itself out kept the builder's own DOM watcher busy, which could leave the editing canvas blank. The markup and the styling are unchanged there \u2014 the editor shows the slider's no-JavaScript state, and the front end is unaffected.<\/li>\n<li>Every piece of markup the plugin prints is now escaped where it is printed, including what an add-on returns through the slide filters, and the block renders through a render callback instead of echoing.<\/li>\n<li>All stored names carry the longer <code>qaiyocs<\/code> prefix (post type, options, meta, form fields, script handles). Sliders saved by an earlier build are moved over automatically on the first load; shortcodes, block markup and CSS class names are unchanged.<\/li>\n<li>The plugin header and the Pro links point at a page that exists.<\/li>\n<\/ul>\n\n<p>New:<\/p>\n\n<ul>\n<li>Separate heading and description colours, per slider and per slide \u2014 the font colour stays the base for both.<\/li>\n<li>Corner radius per slider, with each layout's own rounding as the default.<\/li>\n<li>Transition duration in milliseconds, for the fade and the slide-in.<\/li>\n<li>H1 as a heading tag: only the first slide's heading becomes the H1, so a page keeps a single one.<\/li>\n<li>Heading and description settings are grouped in the editor (Text box \/ Heading \/ Description), and so are the per-slide overrides.<\/li>\n<li>Logo wall: optional multiply blend so JPEG logos lose their white box.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<p>First public release.<\/p>\n\n<ul>\n<li>Custom post type for sliders, with an Overview admin screen as the default landing page.<\/li>\n<li>Five layouts (Overlay, Side by side, Stacked, Carousel, Logo wall) chosen with a visual wireframe picker.<\/li>\n<li>Logo wall: one or two rows, left\/right and alternating directions, speed in pixels per second, faded edges, shared logo height and gap, linkable logos, an optional multiply blend for JPEG logos, Schema.org Organization list, pause on hover and focus, reduced-motion fallback.<\/li>\n<li>\"Add several images\" in the slide editor: pick many images at once and each becomes its own slide.<\/li>\n<li>HappyFiles integration: a \"HappyFiles folder (live)\" slide source that turns every image in a folder into a slide at render time, an \"Add HappyFiles folder\" button that adds such a slide in one step, plus a \"Slider link\" field on images in the Media Library.<\/li>\n<li>Slide repeater editor: static, single-post and CPT-query dynamic sources; duplicate a slide or a whole slider.<\/li>\n<li>Ken Burns effect, optional per-slide video backgrounds, and an animated autoplay progress indicator.<\/li>\n<li>Configurable box position, background color, font family\/size\/color, separate mobile height and an extra CSS class (global defaults + per-slide overrides).<\/li>\n<li>Real <code>&lt;img&gt;<\/code> slides (never CSS background), eager-load first slide \/ lazy-load the rest, never a forced <code>h1<\/code>.<\/li>\n<li>Accessible carousel markup: ARIA roles, <code>aria-controls<\/code>, a polite live region, keyboard navigation, touch swipe, prefers-reduced-motion support, pause\/play control.<\/li>\n<li>Optional Schema.org <code>ItemList<\/code> JSON-LD.<\/li>\n<li>Shortcode and a server-rendered Gutenberg block.<\/li>\n<li>Bundled translations: English, Hungarian, German, French, Spanish, Japanese, Portuguese, Italian, Russian, Turkish, Polish.<\/li>\n<li>Polylang, WPML, TranslatePress and Loco Translate compatible.<\/li>\n<li>The layout picker and the Overview screen preview the Pro-only layouts as locked tiles, so you can see what they look like before upgrading.<\/li>\n<li>Stable hook\/filter surface for a future Pro add-on (ACF\/Meta Box field mapping, WooCommerce source, advanced query, scheduling, <code>before_slide_content<\/code> \/ <code>after_slide_content<\/code>).<\/li>\n<\/ul>","raw_excerpt":"SEO and AI-friendly content slider: five layouts incl. a partner logo wall, Ken Burns, video backgrounds, dynamic and HappyFiles sources.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368325"}],"author":[{"embeddable":true,"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/qaiyo"}],"wp:attachment":[{"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368325"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368325"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368325"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368325"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368325"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/arq.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}