{"id":400812,"date":"2026-11-10T21:58:21","date_gmt":"2026-11-10T21:58:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pj-calendar\/"},"modified":"2026-11-11T17:33:45","modified_gmt":"2026-11-11T17:33:45","slug":"pj-calendar","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/pj-calendar\/","author":12863886,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.4","stable_tag":"1.1.4","tested":"7.1.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"PJ Event Timeline","header_author":"PureJeannius","header_description":"Manage performance, tour, speaking or event dates as a post type and show them with the [pjcal] shortcode \u2014 a \"Now & Next\" timeline plus searchable, filterable Past Dates grouped by year.","last_updated":"2026-11-11 17:33:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/purejeannius.com\/products\/pj-event-timeline\/","header_author_uri":"https:\/\/purejeannius.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":127,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.1":{"tag":"1.1.1","author":"jquinn33","date":"2026-11-10 21:58:02","revision":3795333},"1.1.2":{"tag":"1.1.2","author":"jquinn33","date":"2026-11-11 02:20:38","revision":3795549},"1.1.3":{"tag":"1.1.3","author":"jquinn33","date":"2026-11-11 03:40:00","revision":3795607},"1.1.4":{"tag":"1.1.4","author":"jquinn33","date":"2026-11-11 17:33:45","revision":3796789}},"upgrade_notice":{"1.1.4":"<p>A refreshed settings screen. No changes to your dates, settings or shortcodes.<\/p>","1.1.3":"<p>Updates the link to the PJ Event Timeline Pro page. No other changes.<\/p>","1.1.2":"<p>PJ Calendar is now PJ Event Timeline. Same plugin, same shortcode, and all your dates and settings stay as they are.<\/p>","1.1.1":"<p>Cache clearing on permanent delete, and correct plurals in translations.<\/p>","1.1.0":"<p>Custom colors, fonts and a site-wide hero photo are now part of the plugin.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3795352,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3795352,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3795352,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3795547,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3795547,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.1","1.1.2","1.1.3","1.1.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3796803,"resolution":"1","location":"assets","locale":"","width":797,"height":1626},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3795606,"resolution":"2","location":"assets","locale":"","width":640,"height":1300},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3795619,"resolution":"3","location":"assets","locale":"","width":1240,"height":1155},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3796789,"resolution":"4","location":"assets","locale":"","width":1400,"height":3063},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3796789,"resolution":"5","location":"assets","locale":"","width":1400,"height":3028}},"screenshots":{"1":"Now &amp; Next timeline and Past Dates with search, filters and statistics (light scheme).","2":"The dark scheme with a hero photo on a wide screen.","3":"Editing a date \u2014 times, venue picker, tags.","4":"Settings \u2192 PJ Event Timeline."}},"plugin_section":[],"plugin_tags":[416,1486,52830,5575,10943],"plugin_category":[40],"plugin_contributors":[290693],"plugin_business_model":[],"class_list":["post-400812","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-events","plugin_tags-performances","plugin_tags-timeline","plugin_tags-tour-dates","plugin_category-calendar-and-events","plugin_contributors-jquinn33","plugin_committers-jquinn33"],"banners":{"banner":"https:\/\/ps.w.org\/pj-calendar\/assets\/banner-772x250.png?rev=3795547","banner_2x":"https:\/\/ps.w.org\/pj-calendar\/assets\/banner-1544x500.png?rev=3795547","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/pj-calendar\/assets\/icon.svg?rev=3795352","icon":"https:\/\/ps.w.org\/pj-calendar\/assets\/icon.svg?rev=3795352","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/pj-calendar\/assets\/screenshot-1.png?rev=3796803","caption":"Now &amp; Next timeline and Past Dates with search, filters and statistics (light scheme)."},{"src":"https:\/\/ps.w.org\/pj-calendar\/assets\/screenshot-2.png?rev=3795606","caption":"The dark scheme with a hero photo on a wide screen."},{"src":"https:\/\/ps.w.org\/pj-calendar\/assets\/screenshot-3.png?rev=3795619","caption":"Editing a date \u2014 times, venue picker, tags."},{"src":"https:\/\/ps.w.org\/pj-calendar\/assets\/screenshot-4.png?rev=3796789","caption":"Settings \u2192 PJ Event Timeline."},{"src":"https:\/\/ps.w.org\/pj-calendar\/assets\/screenshot-5.png?rev=3796789","caption":""}],"raw_content":"<!--section=description-->\n<p>PJ Event Timeline turns a list of dates into a page your visitors can actually use. Add each date as its own entry (title, event, start\/end dates and times, venue, city, state, link, tags, category), place the <code>[pjcal]<\/code> shortcode on a page, and you get:<\/p>\n\n<ul>\n<li><strong>Now &amp; Next<\/strong> \u2014 a timeline of everything in progress or upcoming, with \"Today\", \"In progress\" and \"Upcoming\" status, start\/end times (or all day) and an optional tickets\/info link.<\/li>\n<li><strong>Past Dates<\/strong> \u2014 every finished date grouped by year, newest first, with instant search, category filter chips, a sort toggle and a statistics strip (total events, locations, years active).<\/li>\n<li><strong>Automatic rollover<\/strong> \u2014 the split between upcoming and past is worked out in the visitor's browser, so a date moves to Past the day after it ends even on an aggressively cached page.<\/li>\n<li><strong>Optional hero photo<\/strong> \u2014 choose one site-wide photo, pass an attachment ID or URL per timeline, or let it use the page's featured image. Shown as a full-width banner with the title over it; or choose the side layout, where the photo pins to the left while the dates scroll.<\/li>\n<li><strong>Your colors and fonts<\/strong> \u2014 light or dark scheme, six accent presets or any accent color, custom background, card and text colors, and your own heading and body fonts (with an optional web-font stylesheet). Leave them empty and it follows the scheme and your theme.<\/li>\n<li><strong>Projects, not just events<\/strong> \u2014 flag a category as a \"project\" (studio time, writing, development) and those dates show their project title as the heading and stay out of the statistics.<\/li>\n<li><strong>Reusable venues<\/strong> \u2014 save a venue once with its city, state, address and website, then pick it from a list; a date's blank city\/state fall back to the venue's. On the timeline the venue name links to its website, and a venue with a street address gets a map pin that opens Google Maps.<\/li>\n<li><strong>Hide without deleting<\/strong> \u2014 a \"Hide from the timeline\" switch in Date Details, Quick Edit, Bulk Edit and the row actions keeps a date on file but out of every timeline and statistic.<\/li>\n<li><strong>Admin niceties<\/strong> \u2014 a Status column with Current &amp; Upcoming \/ Past \/ Hidden filters, a Duplicate row action for repeat venues, a Dates column sorted by start date, and a warning on any entry missing a start date.<\/li>\n<li><strong>Cache-aware<\/strong> \u2014 clears WP Fastest Cache, W3 Total Cache, WP Super Cache or WP Rocket when dates change (optional), and fires <code>pjcal_purge_cache<\/code> for other caching plugins.<\/li>\n<\/ul>\n\n<h4>Shortcode<\/h4>\n\n<pre><code>[pjcal] with no attributes uses the defaults from Settings \u2192 PJ Event Timeline. Attributes:\n<\/code><\/pre>\n\n<ul>\n<li><code>title<\/code>, <code>eyebrow<\/code> \u2014 heading and the small text above it.<\/li>\n<li><code>now_title<\/code>, <code>past_title<\/code>, <code>empty_now<\/code> \u2014 section titles and the message shown when nothing is upcoming.<\/li>\n<li><code>image<\/code> \u2014 attachment ID or image URL for the hero photo (default: the site-wide photo from Settings, otherwise the page's featured image; <code>\"none\"<\/code> for no photo). <code>focus<\/code> \u2014 CSS object-position, e.g. <code>\"50% 20%\"<\/code>.<\/li>\n<li><code>layout<\/code> \u2014 <code>top<\/code> (default: the photo is a banner above the dates) or <code>side<\/code> (pinned beside the dates on wide screens).<\/li>\n<li><code>scheme<\/code> \u2014 <code>light<\/code> or <code>dark<\/code>. <code>accent<\/code> \u2014 <code>wine<\/code>, <code>coral<\/code>, <code>pink<\/code>, <code>ocean<\/code>, <code>forest<\/code>, <code>slate<\/code>, <code>custom<\/code> (the color picked under Settings) or any hex color such as <code>#0f6e8c<\/code>.<\/li>\n<li><code>category<\/code> \u2014 comma-separated category slugs to show only those categories.<\/li>\n<li><code>open_years<\/code> \u2014 how many year groups start expanded (default 2).<\/li>\n<li><code>now_limit<\/code> \u2014 show this many upcoming dates, with the rest behind a \"Show N more\" button (default 0 = all).<\/li>\n<li><code>show_stats<\/code>, <code>show_search<\/code>, <code>show_filters<\/code> \u2014 <code>yes<\/code> or <code>no<\/code>.<\/li>\n<li><code>show<\/code> \u2014 <code>both<\/code> (default), <code>upcoming<\/code> or <code>past<\/code> to show only one section.<\/li>\n<li><code>fullbleed=\"yes\"<\/code> \u2014 break out of a boxed content area to full viewport width.<\/li>\n<\/ul>\n\n<p>Example: <code>[pjcal title=\"Tour Dates\" scheme=\"dark\" accent=\"ocean\" image=\"123\" category=\"concerts,festivals\"]<\/code><\/p>\n\n<h4>For developers<\/h4>\n\n<p>Filters: <code>pjcal_default_settings<\/code>, <code>pjcal_default_atts<\/code>, <code>pjcal_accent_presets<\/code>, <code>pjcal_accent_hex<\/code>, <code>pjcal_items<\/code>, <code>pjcal_venue_map_url<\/code>, <code>pjcal_l10n<\/code>, <code>pjcal_wrapper_classes<\/code>, <code>pjcal_wrapper_style<\/code>, <code>pjcal_save_meta<\/code>, <code>pjcal_settings_tabs<\/code>, <code>pjcal_shortcode_reference_rows<\/code>.\nActions: <code>pjcal_settings_page_load<\/code>, <code>pjcal_settings_after<\/code>, <code>pjcal_settings_tab_content<\/code>, <code>pjcal_shortcode_reference_after<\/code>, <code>pjcal_meta_box_fields<\/code>, <code>pjcal_before_now<\/code>, <code>pjcal_after_past<\/code>, <code>pjcal_purge_cache<\/code>.\nThemes can restyle by overriding CSS custom properties on <code>.pjcal<\/code> (e.g. <code>--pjcal-accent<\/code>, <code>--pjcal-top<\/code> for a fixed header height, <code>--pjcal-head<\/code> \/ <code>--pjcal-body<\/code> for fonts). The front-end script fires a <code>pjcal:rendered<\/code> DOM event once a timeline has rendered.<\/p>\n\n<h4>External services<\/h4>\n\n<p>None by default. If you enter a <strong>Font stylesheet URL<\/strong> under Settings \u2192 PJ Event Timeline \u2192 Typography (for example a Google Fonts link), that stylesheet is loaded from the address you entered on pages that show a timeline, so that service receives the visitor's IP address and browser details like any web request. For Google Fonts see the <a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a> and <a href=\"https:\/\/policies.google.com\/terms\">Terms of Service<\/a>. Map pins are ordinary links to Google Maps and contact Google only when a visitor clicks one.<\/p>\n\n<p>Every feature in this plugin is free, with no license key, trial or usage limit.<\/p>\n\n<h4>Add-ons<\/h4>\n\n<p><a href=\"https:\/\/purejeannius.com\/products\/pj-event-timeline\/\">PJ Event Timeline Pro<\/a> is a separate plugin sold on purejeannius.com. It adds tools that are not part of this plugin: a month-grid view, a subscribable calendar feed for Apple Calendar, Outlook and Google Calendar, Google event listings (schema.org Event data), CSV import and export, \"Add to calendar\" links on upcoming dates, and a compact next-dates list for sidebars and footers.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>pj-calendar<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it from Plugins \u2192 Add New.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Event Timeline \u2192 Add Date<\/strong> and enter your dates. Save venues you use often under <strong>Event Timeline \u2192 Venues<\/strong>; create categories under <strong>Event Timeline \u2192 Categories<\/strong> if you want filter chips.<\/li>\n<li>Add <code>[pjcal]<\/code> to any page. Set defaults under <strong>Settings \u2192 PJ Event Timeline<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20create%20a%20public%20page%20for%20each%20date%3F\"><h3>Does it create a public page for each date?<\/h3><\/dt>\n<dd><p>No. Dates are not public posts; they only appear inside the timeline on the page where you place the shortcode.<\/p><\/dd>\n<dt id=\"when%20does%20a%20date%20move%20from%20now%20%26%20next%20to%20past%20dates%3F\"><h3>When does a date move from Now &amp; Next to Past Dates?<\/h3><\/dt>\n<dd><p>The day after its end date (or its start date, for one-day entries). This happens in the visitor's browser, so page caching does not delay it.<\/p><\/dd>\n<dt id=\"do%20i%20have%20to%20make%20%22past%22%20and%20%22upcoming%22%20categories%3F\"><h3>Do I have to make \"Past\" and \"Upcoming\" categories?<\/h3><\/dt>\n<dd><p>No \u2014 that split is automatic. Every date is in Now &amp; Next until its end date passes, then it appears under Past Dates; the admin list has the same Current &amp; Upcoming \/ Past filters. Categories are for the kind of date (concert, festival, studio\u2026).<\/p><\/dd>\n<dt id=\"how%20do%20i%20show%20two%20different%20timelines%3F\"><h3>How do I show two different timelines?<\/h3><\/dt>\n<dd><p>Put each date in a category and use the <code>category<\/code> attribute: <code>[pjcal category=\"band\"]<\/code> on one page, <code>[pjcal category=\"solo\"]<\/code> on another.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20fonts%20or%20use%20my%20brand%20color%3F\"><h3>Can I change the fonts or use my brand color?<\/h3><\/dt>\n<dd><p>Yes. Under Settings \u2192 PJ Event Timeline pick a preset or any accent color, set background, card and text colors, and name your heading and body fonts (plus an optional web-font stylesheet if your theme doesn't load them). For one timeline, use <code>accent=\"#0f6e8c\"<\/code>. Themes can also override the CSS custom properties on <code>.pjcal<\/code>.<\/p><\/dd>\n<dt id=\"where%20do%20the%20statistics%20come%20from%3F\"><h3>Where do the statistics come from?<\/h3><\/dt>\n<dd><p>From past dates only, excluding categories flagged as projects. The first number adds up each date's count field (default 1 per date), the second counts distinct State \/ province \/ country values, the third is the span of years between the first and most recent past date. The labels are editable under Settings \u2192 PJ Event Timeline.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>A cleaner, more modern settings screen: a header with the PureJeannius logo and version, a summary card with your current &amp; upcoming and past date counts (plus All dates \/ Add date buttons), pill-style tabs, each settings section on its own card, wine-colored buttons and checkboxes, and a save bar that stays at the bottom of the screen while you scroll.<\/li>\n<li>Add-ons can reuse the same look: <code>PJCAL_Settings::header()<\/code> and <code>PJCAL_Settings::sections()<\/code>, and extra tabs now sit on a card.<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Links to the PJ Event Timeline Pro page now use its new address (purejeannius.com\/products\/pj-event-timeline\/).<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Renamed from PJ Calendar to PJ Event Timeline. Nothing else changes: the shortcode is still [pjcal], and your dates, venues, categories and settings are untouched.<\/li>\n<li>The admin menu is now \"Event Timeline\", and help text says \"timeline\" instead of \"calendar\".<\/li>\n<li>The default heading for new installs is now \"Events\" (sites with saved settings keep theirs).<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix: permanently deleting a date from the Trash now clears the page cache.<\/li>\n<li>Fix: \"1 date \/ 5 dates\" and \"Show N more\" use proper plural forms in every language.<\/li>\n<li>Settings: the shortcode field's select-on-focus moved from an inline handler into the settings script.<\/li>\n<li>Venue help text no longer mentions an add-on feature.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Any accent color with a color picker, plus <code>accent=\"#hex\"<\/code> per timeline.<\/li>\n<li>Custom background, card, text and muted-text colors.<\/li>\n<li>Heading and body fonts, with an optional web-font stylesheet URL.<\/li>\n<li>Site-wide hero photo chosen from the Media Library.<\/li>\n<li>Settings screen tabs are filterable.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Upcoming dates as a \"Now &amp; Next\" timeline, past dates searchable and grouped by year. For performers, speakers, bands and tours.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/400812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=400812"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jquinn33"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=400812"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=400812"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=400812"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=400812"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=400812"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=400812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}