{"id":1958534,"date":"2023-11-08T12:32:09","date_gmt":"2023-11-08T17:32:09","guid":{"rendered":"https:\/\/theeventscalendar.com\/knowledgebase\/?p=1958534"},"modified":"2026-04-22T01:29:18","modified_gmt":"2026-04-22T05:29:18","slug":"events-seo","status":"publish","type":"post","link":"https:\/\/theeventscalendar.com\/knowledgebase\/events-seo\/","title":{"rendered":"SEO and Search Engine Indexing in The Events Calendar"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"h-improving-seo-with-the-events-calendar\">Improving SEO with The Events Calendar<\/h2>\n\n\n\n<p>Within The Events Calendar, there are many links that impact SEO positively. Being a calendar, however, there can be situations where links and even whole pages should not be indexed\u2014an example being month view, which has the ability to paginate nearly infinitely.<\/p>\n\n\n\n<p>To improve SEO, The Events Calendar implements sensible defaults that discourage infinite page crawling by search engine bots &#8211; all of the ways that we inject meta tags can be overridden with simple filters.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-approaches-to-influencing-search-crawlers\">Approaches to Influencing Search Crawlers<\/h3>\n\n\n\n<p>In this section, we\u2019ll talk about the various approaches to influencing search engine crawlers (automated inspection and indexing of a site).<\/p>\n\n\n\n<p><strong>An important thing to keep in mind:<\/strong> Your events should all be reachable in your sitemap.xml, which search engines use to index specific pages. So, if an event view is set as <em>noindex<\/em> and\/or <em>nofollow<\/em>, the events are still findable via the sitemap.xml.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-month-and-week-views\">Month and Week Views<\/h4>\n\n\n\n<p>Due to the near-infinite nature of these views, we take the stance to add the following noindex, nofollow meta tag to your page\u2019s header.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>&lt;meta name=\"robots\" id=\"tec_noindex\" content=\"noindex, nofollow\" \/&gt;<\/code><\/code><\/pre>\n\n\n\n<p>This tells the search engine crawler to avoid indexing the page and to avoid following links on the page.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-list-style-view\">List-Style View <\/h4>\n\n\n\n<p><strong>(Day, List, Map, Photo, Summary)<\/strong><\/p>\n\n\n\n<p>Due to the nature of these views, we don\u2019t need to be as aggressive with blocking <em>everything<\/em>. Instead, <strong>we only insert a meta tag <\/strong>if there are<strong> no events <\/strong>on the page. When inserting the meta tag, we use <em>noindex, follow<\/em>, and add the following tag to the header:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>&lt;meta name=\"robots\" id=\"tec_noindex\" content=\"noindex, follow\" \/&gt;<\/code><\/code><\/pre>\n\n\n\n<p>This tells the search engine crawler to avoid indexing the page, but it can follow links on the page that are not set to <em>nofollow<\/em>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-single-event-pages\">Single Event Pages<\/h4>\n\n\n\n<p>We <strong>do not inject <\/strong>a <em>noindex<\/em>, <em>nofollow<\/em>, or <em>follow<\/em> meta tag on single event pages. If you wish to add a meta tag of your choosing, you will have to do so through some other means.<\/p>\n\n\n\n<p><em>Note: we <\/em><strong><em>do<\/em><\/strong><em> inject meta tags where appropriate on Organizer and Venue pages, but that can be altered with a filter that we talk about below.<\/em><\/p>\n\n\n\n<p>We <strong>do not inject<\/strong> a <em>noindex<\/em>, <em>nofollow<\/em>, or <em>follow<\/em> meta tag if the main events view is set as the site\u2019s homepage. This approach is non-overridable, so if you wish to add a meta tag of your choosing to your homepage, you will have to do so through some other means.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-pages-with-event-shortcodes\">Pages with Event Shortcodes<\/h4>\n\n\n\n<p>Because shortcode usage is meant for extreme flexibility, we <strong>do not inject<\/strong> a <em>noindex<\/em>, <em>nofollow<\/em>, or <em>follow<\/em> meta tag onto pages with event views included via shortcodes. If you wish to add a meta tag to a page with a shortcode, you will have to do so through some other means.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-optimizing-event-pages-for-seo\">Optimizing Event Pages for SEO<\/h3>\n\n\n\n<p>Optimizing your event pages for SEO is crucial to increase visibility, attract more attendees, and enhance the overall success of your events. Here&#8217;s a comprehensive guide to help you achieve this:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-1-conduct-targeted-keyword-research\">1. Conduct Targeted Keyword Research<\/h4>\n\n\n\n<p>Begin by identifying keywords that potential attendees might use when searching for events like yours. Utilize tools such as <a href=\"https:\/\/ads.google.com\/aw\/keywordplanner\/home?ocid=58538771&amp;euid=62392571&amp;__u=2607447779&amp;uscid=58538771&amp;__c=8326571579&amp;authuser=0\">Google Keyword Planner&nbsp;<\/a>to discover relevant terms. Focus on long-tail keywords that combine event type, location, and date, such as \u201cart workshop in Brooklyn 2025\u201d or \u201cvirtual marketing seminar June 2025.\u201d&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-2-craft-compelling-and-informative-content\">2. Craft Compelling and Informative Content<\/h4>\n\n\n\n<p>Ensure your event pages contain detailed descriptions that are engaging and informative. Include essential details like the event&#8217;s purpose, date,&nbsp;and what attendees can expect. Aim for content that is at least 300 words to provide sufficient information for both users and search engines. <br><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-3-optimize-meta-tags-and-headings\">3. Optimize Meta Tags and Headings<\/h4>\n\n\n\n<p>Create unique and descriptive title tags and meta descriptions for each event page. Incorporate primary keywords naturally to improve search engine rankings. Use heading tags (H1, H2, H3) to structure your content, making it easier for search engines to understand the hierarchy and for users to navigate the information.<\/p>\n\n\n\n<p>This <a href=\"https:\/\/theeventscalendar.com\/blog\/venue-marketing\/\">blog post<\/a> shows how we used the heading tags on our site:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1741\" height=\"793\" src=\"https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.41-AM.png\" alt=\"\" class=\"wp-image-1965804\" srcset=\"https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.41-AM.png 1741w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.41-AM-300x137.png 300w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.41-AM-1024x466.png 1024w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.41-AM-768x350.png 768w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.41-AM-1536x700.png 1536w\" sizes=\"auto, (max-width: 1741px) 100vw, 1741px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1586\" height=\"782\" src=\"https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.50-AM.png\" alt=\"\" class=\"wp-image-1965806\" srcset=\"https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.50-AM.png 1586w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.50-AM-300x148.png 300w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.50-AM-1024x505.png 1024w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.50-AM-768x379.png 768w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.04.50-AM-1536x757.png 1536w\" sizes=\"auto, (max-width: 1586px) 100vw, 1586px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-4-implement-event-schema-markup\">4. Implement Event Schema Markup<\/h4>\n\n\n\n<p>Utilize structured data (schema markup) to provide search engines with detailed information about your events. This can enhance your listings in search results with rich snippets, displaying details like date, location, and ticket information. Tools like <a href=\"https:\/\/www.google.com\/webmasters\/markup-helper\/u\/0\/\">Google&#8217;s Structured Data Markup Helper<\/a> can assist in adding this to your pages. See below to read more about Schema Markup.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-5-build-quality-backlinks\">5. Build Quality Backlinks<\/h4>\n\n\n\n<p>Increase your event page&#8217;s authority by obtaining backlinks from reputable websites. Reach out to local blogs, industry influencers, and partners to share your event.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-6-ensure-mobile-friendliness-and-fast-load-times\">6. Ensure Mobile-Friendliness and Fast Load Times<\/h4>\n\n\n\n<p>With a significant number of users accessing websites via mobile devices, ensure your event pages are responsive and load quickly. Use tools like <a href=\"https:\/\/pagespeed.web.dev\/\">Google&#8217;s PageSpeed Insights<\/a> to identify and fix performance issues, enhancing user experience and SEO rankings.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1804\" height=\"765\" src=\"https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.10.08-AM.png\" alt=\"\" class=\"wp-image-1965808\" srcset=\"https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.10.08-AM.png 1804w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.10.08-AM-300x127.png 300w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.10.08-AM-1024x434.png 1024w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.10.08-AM-768x326.png 768w, https:\/\/images.theeventscalendar.com\/kb\/uploads\/2025\/06\/Image-2025-06-30-at-11.10.08-AM-1536x651.png 1536w\" sizes=\"auto, (max-width: 1804px) 100vw, 1804px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-7-monitor-and-analyze-performance\">7. Monitor and Analyze Performance<\/h4>\n\n\n\n<p>After implementing SEO strategies, regularly monitor your event pages&#8217; performance using tools like Google Analytics and Google Search Console. Track metrics such as organic traffic, bounce rates, and conversion rates to assess the effectiveness of your SEO efforts and make necessary adjustments.<\/p>\n\n\n\n<p>By following these steps, you can enhance the visibility of your event pages, attract a larger audience, and ensure the success of your events.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-schema-markup\">Schema Markup<\/h2>\n\n\n\n<p>In the ever-evolving digital marketing and SEO landscape, staying ahead of the competition requires more than just great content; it demands optimization techniques that make your website more visible and accessible to search engines.<\/p>\n\n\n\n<p>One such technique is Schema markup. This powerful tool significantly enhances your search engine visibility and improves user engagement by leveraging the power of <strong>Rich Snippets<\/strong> (enhanced search results provide additional information beyond the standard link, such as review ratings, product details, recipe information, or event details).<\/p>\n\n\n\n<p>For websites using The Events Calendar plugin, the Events schema markup is automatically added to your event pages. This ensures that your events appear in the most informative and eye-catching way.<\/p>\n\n\n\n<p>In this article, we explore the essentials of schema markup, its importance, and how you can effectively implement it to maximize the impact of your events.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-introduction-to-schema-markup\">Introduction to Schema Markup<\/h3>\n\n\n\n<p>Schema markup, also known as structured data, is a microdata format that helps search engines understand the content of your web pages more effectively. Adding schema markup to your pages improves how search engines represent your page in results, leading to better visibility and higher click-through rates.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>Note:<\/strong> While schema markup does not directly affect your search rankings, it can improve your click-through rates (CTR) by making your listings more attractive and informative.<\/pre>\n\n\n\n<p>As mentioned, The Events Calendar automatically adds schema markup to your event pages. Let&#8217;s dive deeper to learn more about this and which markups our main plugins include.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-additional-resources\">Additional resources<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Event Schema markup &#8211; <a href=\"https:\/\/schema.org\/Event\">Official markup docs<\/a> <\/li>\n\n\n\n<li>Google Search Central &#8211; <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/event\">Event structured data<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/search.google.com\/test\/rich-results\" target=\"_blank\" rel=\"noreferrer noopener\">Google&#8217;s Rich Results &#8211; Testing tool<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/validator.schema.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Schema Markup Validator<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-schema-markup-for-the-events-calendar-plugin\">Schema Markup for The Events Calendar plugin<\/h3>\n\n\n\n<p>The event schema markup is automatically added to your calendar view and single event pages using the free Events Calendar plugin.<\/p>\n\n\n\n<p>Let&#8217;s look at the required and optional event schema items to understand how it works.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Required Fields<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>@context<\/strong>: This is automatically added, always as &#8220;<a href=\"https:\/\/schema.org\">https:\/\/schema.org<\/a>&#8220;.<br><\/li>\n\n\n\n<li><strong>@type<\/strong>: Automatically added as the &#8220;Event&#8221; type.<br><\/li>\n\n\n\n<li><strong>name<\/strong>: The name of the event <em>(Your event post title)<br><\/em><\/li>\n\n\n\n<li><strong>startDate<\/strong>: The start date and time of the event <em>(in the <a href=\"http:\/\/en.wikipedia.org\/wiki\/ISO_8601\" target=\"_blank\" rel=\"noreferrer noopener\">ISO 8601 date format<\/a>)<\/em>.<br><\/li>\n\n\n\n<li><strong>Location:<\/strong> the event&#8217;s location. You can use the Place type for physical locations, which fills in with your Venue data\u2014name and address\u2014so remember to add a venue for your events. Alternatively, use the VirtualLocation type for virtual locations (a feature provided by the Virtual Events plugin).<\/li>\n<\/ol>\n\n\n\n<p>That said, let&#8217;s see an example showing how the JSON-LD schema data appears on your page source code:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n&lt;script type=&quot;application\/ld+json&quot;&gt;\n&#x5B;{&quot;@context&quot;:&quot;http:\/\/schema.org&quot;,\n&quot;@type&quot;:&quot;Event&quot;,\n   &quot;name&quot;:&quot;Hosted Dinner with Chef Monica Geller&quot;,\n   &quot;description&quot;:&quot;Join Chef Moinca Geller for a Hosted Dinner! She will discuss how her weight loss contributed to her wanting to be a chef all while preparing her guests a healthy, balanced meal for you to enjoy.&quot;,\n   &quot;startDate&quot;:&quot;2024-06-15T18:30:00-04:00&quot;\n   &quot;location&quot;:{\n      &quot;@type&quot;:&quot;Place&quot;,\n      &quot;name&quot;:&quot;ABC Cooking School Event Center&quot;,\n      &quot;description&quot;:&quot;The ABC Cooking School is the best event center of New York&quot;,\n      &quot;address&quot;:{\n         &quot;@type&quot;:&quot;PostalAddress&quot;,\n         &quot;streetAddress&quot;:&quot;123 1st Aveune&quot;,\n         &quot;addressLocality&quot;:&quot;New York City&quot;,\n         &quot;addressRegion&quot;:&quot;NY&quot;,\n         &quot;postalCode&quot;:&quot;10036&quot;,\n         &quot;addressCountry&quot;:&quot;United States&quot;\n      },\n}]\n&lt;\/script&gt;\n<\/pre><\/div>\n\n\n<h4 class=\"wp-block-heading\">Optional Fields<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>endDate<\/strong>: The end date and time of the event in ISO 8601 date format.<br><\/li>\n\n\n\n<li><strong>description<\/strong>: A brief description of the event, automatically filled with your event post content.<br><\/li>\n\n\n\n<li><strong>image<\/strong>: URLs of images related to the event. Your <a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/featured-images\/\" target=\"_blank\" rel=\"noreferrer noopener\">Featured Image<\/a> will be automatically included there.<br><\/li>\n\n\n\n<li><strong>eventStatus<\/strong>: The status of your event. When creating your events, the Event Status meta box will automatically set your event as a Scheduled event, but you can change it to &#8220;Canceled&#8221; or &#8220;Postponed&#8221; statuses. You can learn more about those statuses on the <a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/creating-an-event\/#:~:text=front%20and%20center.-,Event%20Status,-Usually%20found%20in\">&#8220;Creating Events&#8221; article.<br><\/a><\/li>\n\n\n\n<li><strong>EventAttendanceMode<\/strong>: indicates whether it occurs online, offline, or a mix. All events are automatically set as an Online event. Using the Virtual Events plugin, you can create Online and Mixed events.<br><\/li>\n\n\n\n<li><strong>offers<\/strong>: Details about the ticket or entry offer, including price, currency, availability, and URL for purchasing tickets.<br>The Events Calendar provides a price field where you can set the value and currency. Using the Event Tickets plugin, that field is hidden as that data comes from the tickets created on your event page.<br><\/li>\n\n\n\n<li><strong>organizer<\/strong>: Information about the organization or person organizing the event, including name and URL. The Events Calendar provides the <a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/venue-and-organizer-pages\/#create-org\">Organizer post type<\/a>, where you can create event organizers and select them when creating your events.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-schema-markup-for-event-tickets-plugin\">Schema Markup for Event Tickets plugin<\/h3>\n\n\n\n<p>The Event Tickets plugin enhances your event listings by automatically populating the &#8220;offers&#8221; field in the Event schema markup. This integration ensures that search engines can display detailed information about ticket availability, prices, and purchasing options directly in search results, improving your event&#8217;s visibility and attractiveness to potential attendees.<\/p>\n\n\n\n<p>When you add tickets to an event using the Event Tickets plugin, the plugin automatically generates structured data that includes the following key elements in the &#8220;offers&#8221; field:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>@type<\/strong>: Specifies the type of offer, automatically set to &#8220;Offer&#8221;.<\/li>\n\n\n\n<li><strong>url<\/strong>: Provides the URL where users can purchase the tickets (your event\/page URL).<\/li>\n\n\n\n<li><strong>price<\/strong>: Displays the ticket price.<\/li>\n\n\n\n<li><strong>priceCurrency<\/strong>: Indicates the currency of the ticket price.<\/li>\n\n\n\n<li><strong>availability<\/strong>: Shows the availability status of the tickets, such as &#8220;InStock&#8221; or &#8220;SoldOut&#8221;.<\/li>\n\n\n\n<li><strong>validFrom<\/strong>: States the date and time the ticket is available for purchase.<\/li>\n<\/ul>\n\n\n\n<p>This automated process ensures that your event listings are enriched with accurate and up-to-date information, making it easier for users to find and purchase tickets.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-events-schema-with-seo-plugins\">Events Schema with SEO Plugins<\/h3>\n\n\n\n<p>The quality of your schema markup implementation plays an important role in optimizing your event-related content for search engines. The Events Calendar and Event Tickets plugins automatically generate and integrate the most effective event schema markup for your events and tickets. This ensures that search engines appropriately index and display your event information, enhancing visibility and user engagement without additional SEO plugins.<\/p>\n\n\n\n<p>While third-party SEO plugins like Yoast SEO or Rank Math offer general schema markup capabilities, they may not be as specialized or comprehensive for events as The Events Calendar. Here\u2019s why:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>General vs. Specific<\/strong>: SEO plugins provide many schema types but may not delve deep into the specifics required for events and tickets.<\/li>\n\n\n\n<li><strong>Manual Configuration:<\/strong> Configuring event-specific schema markup with SEO plugins often requires additional setup or code customization, whereas The Events Calendar handles this automatically.<\/li>\n\n\n\n<li><strong>Potential Conflicts<\/strong>: Using multiple plugins to handle schema markup can lead to conflicts and duplicate schema, which may confuse search engines and negatively impact SEO.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-customizing-schema\">Customizing Schema<\/h3>\n\n\n\n<p>In this section, you will find custom PHP snippets created to answer some support questions we received.<\/p>\n\n\n\n<p>To use those snippets, you can add the PHP snippet to your theme&#8217;s functions.php file or use your preferred method for integrating snippets into your WordPress site, such as the free <a href=\"https:\/\/wordpress.org\/plugins\/code-snippets\/\" target=\"_blank\" rel=\"noreferrer noopener\">Code Snippets<\/a> plugin.<\/p>\n\n\n\n<p>Note that all snippets will now include a &#8220;class_exist&#8221; PHP function to check if the classes declared by each plugin exist. This function detects whether the Events Calendar and other mentioned plugins are enabled. This check ensures that you only run those snippets if those plugins exist on your website, preventing potential issues from declaring a function for something unavailable on your website.<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\" id=\"h-disable-the-events-calendar-schemas\">Disable The Events Calendar Schemas<\/h4>\n\n\n\n<p>If you prefer to use a third-party plugin to manage all the schemas, you will need to disable the default schema markup provided by The Events Calendar. For that, you can use the following PHP snippet:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: false; title: ; notranslate\" title=\"\">\nif ( class_exists(&#039;Tribe__Events__Main&#039;) ) {\n  \/\/ Remove Schema JSON from Calendar view URLS\n  add_filter( &#039;tribe_events_views_v2_view_json_ld_markup&#039;, &#039;__return_empty_string&#039; );\n\n  \/\/Remove Schema JSON from Single Event URLS\n  add_filter( &#039;tribe_json_ld_markup&#039;, &#039;__return_empty_string&#039; );\n}\n<\/pre><\/div>\n\n\n<p>Filter: <a href=\"https:\/\/docs.theeventscalendar.com\/reference\/hooks\/tribe_events_views_v2_view_json_ld_markup\/\" target=\"_blank\" rel=\"noreferrer noopener\">tribe_events_views_v2_view_json_ld_markup<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h4 class=\"wp-block-heading\" id=\"h-change-the-events-schema-type-to-a-custom-schema-type\">Change the &#8220;Events&#8221; Schema Type to a Custom Schema Type<\/h4>\n\n\n\n<p>If all your events are Music events, you may want to change the default event type to use the <a href=\"https:\/\/schema.org\/MusicEvent\" target=\"_blank\" rel=\"noreferrer noopener\">MusicEvent schema type<\/a>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: false; title: ; notranslate\" title=\"\">\nif ( class_exists(&#039;Tribe__Events__Main&#039;)) {\n  add_filter( &#039;tribe_json_ld_event_object&#039;, &#039;customize_event_json_ld&#039;, 10, 3 );\n\n  function customize_event_json_ld( $data, $args, $post ) {\n      \/\/ Change event type from &quot;Event&quot; to &quot;MusicEvent&quot;\n      if ( isset( $data-&gt;{&#039;@type&#039;} ) &amp;&amp; &#039;Event&#039; === $data-&gt;{&#039;@type&#039;} ) {\n          $data-&gt;{&#039;@type&#039;} = &#039;MusicEvent&#039;;\n      }\n\n      \/\/ Remove the default &quot;performer&quot; set as &quot;Organization&quot;\n      if ( isset( $data-&gt;performer ) ) {\n          unset( $data-&gt;performer );\n      }\n\n      \/\/ Change the default &quot;Organizer&quot; to be used as &quot;Performer&quot;\n      if ( isset( $data-&gt;organizer ) ) {\n          $data-&gt;performer = $data-&gt;organizer;\n          unset( $data-&gt;organizer );\n      }\n\n      \/\/ Change the new &quot;performer&quot; type from &quot;Person&quot; to &quot;MusicGroup&quot;\n      if ( isset( $data-&gt;performer ) &amp;&amp; &#039;Person&#039; === $data-&gt;performer-&gt;{&#039;@type&#039;} ) {\n          $data-&gt;performer-&gt;{&#039;@type&#039;} = &#039;MusicGroup&#039;;\n      }\n\n      return $data;\n  }\n}\n<\/pre><\/div>\n\n\n<p>Filter: <a href=\"https:\/\/docs.theeventscalendar.com\/reference\/classes\/tribe__tickets__json_ld__order\/\" target=\"_blank\" rel=\"noreferrer noopener\">tribe__tickets__json_ld__order<\/a><\/p>\n<\/div><\/div>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-how-to-disable-yoast-seo-schemas-for-single-event-urls\">How to Disable Yoast SEO Schemas for Single Event URLs<\/h4>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: false; title: ; notranslate\" title=\"\">\nif ( class_exists(&#039;Tribe__Events__Main&#039;) &amp;&amp; class_exists (&#039;WPSEO_Frontend&#039;) ) {\n\tfunction custom_yoast_schema() {\n\t\tif ( is_singular(&#039;tribe_events&#039;)){\n\t\t\tadd_filter( &#039;wpseo_json_ld_output&#039;, &#039;__return_false&#039; );\n\t\t}\n\t}\n\n\tadd_filter( &#039;template_redirect&#039;, &#039;custom_yoast_schema&#039; );\n}\n<\/pre><\/div>\n\n\n<p>Filter: <a href=\"https:\/\/developer.yoast.com\/features\/schema\/api\/\" target=\"_blank\" rel=\"noreferrer noopener\">wpseo_json_ld_output<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-how-to-disable-rank-math-schemas-for-single-event-urls\">How to Disable Rank Math Schemas for Single Event URLs<\/h4>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: false; title: ; notranslate\" title=\"\">\nif (class_exists(&#039;Tribe__Events__Main&#039;) &amp;&amp; class_exists(&#039;RankMath&#039;)) {\n   function custom_rankmath_schema($data, $jsonld) {\n      if ( is_singular(&#039;tribe_events&#039;)){\n          return &#x5B;];\n      }\n      return $data;\n  }\n add_filter(&#039;rank_math\/json_ld&#039;,&#039;custom_rankmath_schema&#039;, 99, 2);\n}\n<\/pre><\/div>\n\n\n<p>Filter: <a href=\"https:\/\/rankmath.com\/kb\/filters-hooks-api-developer\/\" target=\"_blank\" rel=\"noreferrer noopener\">rank_math\/json_ld<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-disable-all-in-one-seo-aioseo-schemas-for-single-event-urls\">Disable &#8220;All in One SEO&#8221;(AIOSEO) Schemas for Single Event URLs<\/h4>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; gutter: false; title: ; notranslate\" title=\"\">\nif ( class_exists(&#039;Tribe__Events__Main&#039;) &amp;&amp; class_exists (&#039;AIOSEO&#039;) ) {\n  function aioseo_disable_schema( $disabled ) {\n\t  if ( is_singular(&#039;tribe_events&#039;) ) {\n\t     return true;\n\t  }\n  }\n\n  add_filter( &#039;aioseo_schema_disable&#039;, &#039;aioseo_disable_schema&#039; );\n}\n<\/pre><\/div>\n\n\n<p>Filter: <a href=\"https:\/\/aioseo.com\/docs\/aioseo_schema_disable\/\" target=\"_blank\" rel=\"noreferrer noopener\">aioseo_schema_disable<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-troubleshooting-missing-fields-in-google-search-console\">Troubleshooting Missing Fields in Google Search Console<\/h2>\n\n\n\n<p>Users sometimes report warnings in Google Search Console regarding missing fields in the schema markup for their events. After reviewing the issues shared to us by our users, we&#8217;ve identified several common errors and their causes. Below, we&#8217;ll walk you through the missing fields, explain why they occur, and provide troubleshooting steps to resolve them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Common Missing Field Errors and Their Causes<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-1-missing-field-image\">1. <strong>Missing field &#8220;image&#8221;<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> No featured image has been set for the event.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> Ensure each event has a featured image. This can be done directly in the event editor in your WordPress dashboard.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-2-missing-field-offer\">2. <strong>Missing field &#8220;offer&#8221;<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> This happens when tickets are not available for the event.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> Make sure that the event has tickets available for purchase. If you&#8217;re using <a href=\"https:\/\/theeventscalendar.com\/products\/wordpress-event-tickets\/\" target=\"_blank\" rel=\"noreferrer noopener\">Event Tickets\/Event Tickets Plus<\/a>, verify that tickets are properly configured and available for the event.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-3-missing-field-eventstatus\">3. <strong>Missing field &#8220;eventStatus&#8221;<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> This field is optional and, if not provided, defaults to &#8220;Scheduled.&#8221;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> Our plugin will only set an &#8220;eventStatus&#8221; for events that are <strong>Postponed<\/strong> or <strong>Cancelled<\/strong>. For all other events, this field is omitted, as the default status is considered &#8220;Scheduled.&#8221;<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-4-missing-field-organizer\">4. <strong>Missing field &#8220;organizer&#8221;<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> The event has no organizer set, or only a name is provided without further details.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> Make sure you include full <a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/venue-and-organizer-pages\/#create-org\" target=\"_blank\" rel=\"noreferrer noopener\">organizer information<\/a> for each event, including the organizer\u2019s name, contact details, and URL.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-5-missing-field-url-in-organizer\">5. <strong>Missing field &#8220;url&#8221; (in &#8220;organizer&#8221;)<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> The event has an organizer set, but no URL is provided for the organizer&#8217;s website.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> Add a URL for the organizer&#8217;s website to ensure proper schema markup.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-6-missing-field-location\">6. <strong>Missing field &#8220;location&#8221;<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> No venue has been set for the event.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> Verify that each event has a <a href=\"https:\/\/theeventscalendar.com\/knowledgebase\/venue-and-organizer-pages\/#creating-venue\" target=\"_blank\" rel=\"noreferrer noopener\">correct venue<\/a> information.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-7-missing-field-address-in-location\">7. <strong>Missing field &#8220;address&#8221; (in &#8220;location&#8221;)<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> The venue is set, but no address is provided.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> Make sure to include the full address for the venue, including street, city, and postal code.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-8-missing-field-eventattendancemode\">8. <strong>Missing field &#8220;eventAttendanceMode&#8221;<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> This field is not required unless the event is cancelled or postponed.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> The field will only be added for cancelled or postponed events. For scheduled events, this field is not necessary.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-9-missing-field-performer\">9. <strong>Missing field &#8220;performer&#8221;<\/strong><\/h4>\n\n\n\n<p><strong>Cause:<\/strong> This error typically occurs when using <strong>Yoast SEO<\/strong>. The field is disabled in the plugin code (file <code>\/the-events-calendar\/src\/Events\/Integrations\/Plugins\/WordPress_SEO\/Events_Schema.php<\/code>, line 250), but it is provided when Yoast is disabled (file <code>\/the-events-calendar\/src\/Tribe\/JSON_LD\/Event.php<\/code>, line 150).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Solution:<\/strong> If you&#8217;re using Yoast SEO and encountering this issue, consider disabling Yoast temporarily to allow the performer field to be included in the schema. Alternatively, we may need to create an enhancement ticket in the future to address this issue and include a default performer to avoid this warning.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Steps to Troubleshoot and Validate Schema Markup<\/h3>\n\n\n\n<p><strong>1. Verify Google Search Console Warnings<\/strong>&nbsp;If you receive a Google Search Console warning, please note that we don&#8217;t have direct access to your Search Console data. However, you can share your report with us by following the steps outlined in this <a href=\"https:\/\/www.seroundtable.com\/google-search-console-share-report-29830.html\" target=\"_blank\" rel=\"noreferrer noopener\">article<\/a>.<\/p>\n\n\n\n<p><strong>2. Test Event URL Using Rich Results Tool<\/strong>&nbsp;SEO plugins may sometimes add additional schema markup. To ensure the schema is correct and matches what&#8217;s being sent to Google, we recommend testing the URL of an event page using Google&#8217;s <strong><a href=\"https:\/\/search.google.com\/test\/rich-results\" target=\"_blank\" rel=\"noreferrer noopener\">Rich Results Testing Tool<\/a><\/strong>.<\/p>\n\n\n\n<p>This tool will provide a preview of the structured data Google sees on your event page and help identify any missing fields or errors.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-solving-the-discovered-currently-not-indexed-notice-on-google-search-console\">Solving the &#8220;Discovered \u2013 Currently Not Indexed&#8221; Notice on Google Search Console<\/h2>\n\n\n\n<p>When creating your events with The <a href=\"https:\/\/theeventscalendar.com\/products\/wordpress-events-calendar\/\" target=\"_blank\" rel=\"noreferrer noopener\">Events Calendar and Events Calendar Pro<\/a>, you&#8217;ll likely want those events to appear when users search for you on a popular search engine like Google.<\/p>\n\n\n\n<p>However, you may see a message:&nbsp;<strong>&#8220;Discovered \u2013 currently not indexed&#8221;<\/strong>&nbsp;in the <a href=\"https:\/\/search.google.com\/search-console\/about\" target=\"_blank\" rel=\"noreferrer noopener\">Google Search Console<\/a> tool. This indicates that Google has already crawled your URLs but hasn&#8217;t indexed them yet. This is completely normal, as crawling and indexing are different phases. For most websites, this URL state is natural and will automatically resolve after Google has processed the URLs and added them to their index.<\/p>\n\n\n\n<p>It is likely only a matter of time before your pages are indexed, which is usually related to Google&#8217;s crawl budget. In most cases, if that message is only appearing for a few days or weeks, simply wait for the indexing phase to happen properly\u2014Google will do it eventually.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-next-steps\">Next Steps<\/h4>\n\n\n\n<p>If you&#8217;re still experiencing site-wide issues with Google search, check that your event pages contain enough unique information. This way, Google will be able to identify your events as individual events and create separate entries. If all of your events contain the same title and description, that is not enough information for Google to add your events to the search results.<\/p>\n\n\n\n<p>It&#8217;s important to note that Google has quality thresholds that pages must meet, since it cannot possibly crawl and index everything on the web. In other words, the issue may point to a site-wide concern rather than a problem with a few individual events. Google may view some pages on your domain as not worth crawling and skip them, prioritizing other, more <a href=\"https:\/\/yoast.com\/ultimate-guide-content-seo\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>valuable content<\/strong><\/a>\u2014as a result, these URLs are marked as <strong>&#8220;Discovered \u2013 currently not indexed.&#8221;<\/strong><\/p>\n\n\n\n<p>To start addressing this issue, go through the list of affected URLs and <strong>ensure each page contains unique content<\/strong>. The content should satisfy the user&#8217;s search intent and solve a specific problem.<\/p>\n\n\n\n<p>You may also want to look into the&nbsp;<a href=\"https:\/\/developers.google.com\/search\/docs\/fundamentals\/creating-helpful-content\" target=\"_blank\" rel=\"noreferrer noopener\">Quality Rater Guidelines<\/a>&nbsp;that Google follows when evaluating websites, as they will help you understand what Google is looking for in content found on the web.<\/p>\n\n\n\n<p>To summarize, look into creating unique event content for each of your events, and you&#8217;ll be good to go!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-controlling-how-google-indexes-your-events\">Controlling How Google Indexes Your Events<\/h2>\n\n\n\n<p>Sometimes&nbsp;<a href=\"https:\/\/theeventscalendar.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">The Events Calendar<\/a>&nbsp;creates multiple links that are indexed by search engines. This may cause some SEO and performance issues on your website. The good news is that our plugin adds a&nbsp;<em>noindex<\/em>&nbsp;meta tag to your page header if t here\u2019s no events listed on that page, to block this duplicate content.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-block-duplicate-content\">Block Duplicate Content<\/h3>\n\n\n\n<p>If there are no events for a specific URL that you see multiple links created for, TEC adds the following <em>noindex<\/em> meta tag to your page&#8217;s header:<\/p>\n\n\n\n<p><code>&lt;meta name=\"robots\" content=\"noindex\"&gt;<\/code><\/p>\n\n\n\n<p>You can also block Google and other search engines from crawling undesired\/empty pages by disallowing some URL paths in the&nbsp;<a href=\"https:\/\/developers.google.com\/search\/docs\/advanced\/robots\/intro\" target=\"_blank\" rel=\"noreferrer noopener\">robots.txt<\/a>&nbsp;file.<\/p>\n\n\n\n<p>To achieve that, you can add a robots.txt file to your server&#8217;s root folder or manage it using SEO plugins.<\/p>\n\n\n\n<p>The following parameters will help block some WordPress folders and URLs, and also Events Calendar parameters:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n## For WordPress\n\nUser-agent: *\nDisallow: \/wp-admin\/*\nDisallow: \/wp-login.php\nDisallow: \/wp-includes\/*\nDisallow: \/wp-content\/*\nDisallow: \/trackback\nDisallow: \/feed\nDisallow: *\/comments\nDisallow: ?replytocom*\nDisallow: *\/comments-page-*\nDisallow: *\/trackback\nDisallow: *\/feed\nDisallow: *\/comments\n\nAllow: \/wp-content\/cache\/*\nAllow: \/wp-content\/uploads\/*\nAllow: \/wp-content\/themes\/*\nAllow: \/wp-content\/plugins\/*\nAllow: \/wp-includes\/js\/*\nAllow: \/wp-includes\/css\/*\n\n## For Events Calendar\nDisallow: *post_type=tribe_events*\nDisallow: *hide_subsequent_recurrences=*\nDisallow: *tribe-bar-date=*\nDisallow: *tribe-venue=*\nDisallow: *eventDisplay=*\nDisallow: *eventDate=*\nDisallow: *paged=*\nDisallow: *pagename=*\nDisallow: *shortcode=*\nDisallow: *ical=*\nDisallow: *outlook-ical=*\nDisallow: *related_series=*\nDisallow: *tribe_geofence=*\nDisallow: *tribe_organizer=*\n\nAllow: \/events\/*\nAllow: \/event\/*\n<\/pre><\/div>\n\n\n<p>With the <a href=\"https:\/\/wordpress.org\/plugins\/wordpress-seo\/\" target=\"_blank\" rel=\"noreferrer noopener\">Yoast SEO<\/a> plugin, you can edit your robots.txt file under <em>wp-admin &gt; Yoast SEO &gt; Tools &gt; File editor<\/em>. Read more in their documentation <a href=\"https:\/\/yoast.com\/help\/how-to-edit-robots-txt-through-yoast-seo\/\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<p>Using the <a href=\"https:\/\/wordpress.org\/plugins\/seo-by-rank-math\/\" target=\"_blank\" rel=\"noreferrer noopener\">Rank Math SEO<\/a> plugin, you can edit the robots.txt file under <em>wp-admin &gt; Rank Math &gt; General Settings &gt; Edit robots.txt<\/em>. Documentation <a href=\"https:\/\/rankmath.com\/kb\/how-to-edit-robots-txt-with-rank-math\/\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-remove-indexing-from-recurring-event-occurrences\">Remove Indexing from Recurring Event Occurrences<\/h3>\n\n\n\n<p>If you want to prevent recurring event occurrences from being indexed by Google, you can use this snippet to automatically add a noindex tag for all occurrences.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nadd_action( &#039;wp_head&#039;, &#039;tec_add_nofollow_to_recurring_events&#039; );\n\n\/**\n * Add &#039;nofollow&#039; to recurring events occurrences\n * \n * @return void\n *\/\nfunction tec_add_nofollow_to_recurring_events() {\n    \/\/ Bail if ECP is not active.\n    if ( ! class_exists( &#039;Tribe__Events__Pro__Main&#039; ) ) {\n\t\treturn;\n    }\n\n    \/\/ Get the post ID.\n    $event_id = get_the_ID();\n\n    \/\/ Bail, if it&#039;s not an event.\n    if ( get_post_type( $event_id ) != &quot;tribe_events&quot; ) {\n\t\treturn;\n    }\n\t\n    \/\/ Bail, if it&#039;s not a single event\n    if ( ! is_single() ){\n        return;\n    }\n\t\/\/ If it&#039;s a recurring event, add the noindex meta tag\n    if ( tribe_is_recurring_event($event_id) ) {\n\t\techo &#039;&lt;meta name=&quot;robots&quot; id=&quot;tec_noindex&quot; content=&quot;noindex, follow&quot; \/&gt;&#039; . &quot;\\n&quot;;\n    }\n}\n<\/pre><\/div>\n\n\n<p>If you&#8217;re looking to have only the first recurrence indexed by Google but not all the subsequent ones, you&#8217;ll need to tweak that code not to include the noindex tag for the first event occurrence.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nadd_action( &#039;wp_head&#039;, &#039;tec_add_nofollow_to_recurring_events&#039; );\n\n\/**\n * Add &#039;nofollow&#039; to recurring events, except for the first instance.\n * \n * @return void\n *\/\nfunction tec_add_nofollow_to_recurring_events() {\n    \/\/ Bail if ECP is not active.\n    if ( ! class_exists( &#039;Tribe__Events__Pro__Main&#039; ) ) {\n\t\treturn;\n    }\n\n    \/\/ Get the post ID.\n    $event_id = get_the_ID();\n\n    \/\/ Bail, if it&#039;s not an event.\n    if ( get_post_type( $event_id ) != &quot;tribe_events&quot; ) {\n\t\treturn;\n    }\n\t\n    \/\/ Bail, if it&#039;s not a single event\n    if ( ! is_single() ){\n        return;\n    }\n\t\n    if ( tribe_is_recurring_event($event_id) ){\n        \/\/ Get the post object.\n\t    $post = get_post( $event_id );\n\t\n\t    \/\/ Check if the event is the first in the recurrence.\n\t    $is_first = \\TEC\\Events\\Custom_Tables\\V1\\Models\\Occurrence::is_first( $post-&gt;_tec_occurrence );\n\n\t    \/\/ If it&#039;s not the first recurrence, add the noindex meta tag\n\t    if ( !$is_first ) {\n\t\t    echo &#039;&lt;meta name=&quot;robots&quot; id=&quot;tec_noindex&quot; content=&quot;noindex, follow&quot; \/&gt;&#039; . &quot;\\n&quot;;\n\t    }\n    }\n}\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-add-noindex-to-the-legacy-recurring-events-page\">Add noindex to the Legacy Recurring Events Page<\/h3>\n\n\n\n<p>If you&#8217;ve been using The Events Calendar for a while, you may have legacy pages for old recurring events (<code>\/event\/[event-name]\/all<\/code>). That page has been replaced by the Series archive page. The following snippet that adds noindex to this page, since it&#8217;s no longer relevant. You can add it to your functions.php file when using <em>Yoast SEO<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nif(class_exists(&#039;WPSEO_Options&#039;)){ \nadd_filter(&quot;wpseo_robots&quot;, function($robots) {\n\tglobal $wp_query;\n\t\tif ( $wp_query-&gt;tribe_is_recurrence_list &amp;&amp; &#039;all&#039; === $wp_query-&gt;get( &#039;eventDisplay&#039; )) {\n        \treturn &quot;noindex&quot;;\n    \t}\n        return $robots;\n\t});\n}\n<\/pre><\/div>\n\n\n<p>If you are using <em>Rank Math<\/em>, here is the example snippet using the proper filters for that plugin:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\" title=\"\">\nadd_filter( &#039;rank_math\/frontend\/robots&#039;, function ( $robots ) {\n    global $wp_query;\n    if ( $wp_query-&gt;tribe_is_recurrence_list &amp;&amp; &#039;all&#039; === $wp_query-&gt;get( &#039;eventDisplay&#039; )) {\n        unset( $robots&#x5B;&#039;index&#039;] );\n\t    $robots&#x5B;&#039;noindex&#039;] = &#039;noindex&#039;;\n    }\n    return $robots;\n});\n<\/pre><\/div>\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" id=\"h-protecting-your-site-from-bot-crawl-overload\">Protecting Your Site from Bot Crawl Overload<\/h2>\n\n\n\n<p><a href=\"https:\/\/theeventscalendar.com\/products\/wordpress-events-calendar\/\" target=\"_blank\" rel=\"noreferrer noopener\">The Events Calendar<\/a> generates numerous dynamic URLs\u2014like daily, weekly, or monthly views, plus filtered date links. Even though many of these pages are noindexed, aggressive bots (e.g., SemrushBot, ahrefsBot, curl scrapers) may crawl them extensively, consuming server resources, slowing down user experience, and even triggering higher hosting costs. Below are some tips for controlling bot crawling.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-1-block-aggressive-urls-via-robots-txt\">1. Block Aggressive URLs via robots.txt<\/h4>\n\n\n\n<p>Add powerful disallow rules to <code><a href=\"https:\/\/www.wpbeginner.com\/glossary\/robots-txt\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">robots.txt<\/a><\/code> to prevent polite bots from crawling dynamic calendar pages:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nUser-agent: *\nDisallow: \/*?tribe-bar-date=\nDisallow: \/*&amp;eventDisplay=\nCrawl-delay: 10\n<\/pre><\/div>\n\n\n<p>While not all bots obey <code>robots.txt<\/code>, those from major crawlers (e.g., Googlebot, Bingbot) typically do.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-2-implement-crawl-delay-and-selective-blocking\">2. Implement Crawl-Delay and Selective Blocking<\/h4>\n\n\n\n<p>Use <code>Crawl-delay<\/code> in <code>robots.txt<\/code> and fine-tune specific crawler settings:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add <code>Crawl-delay: 10<\/code> to calm polite crawlers.<\/li>\n\n\n\n<li>Use Google Search Console to limit Googlebot if needed, as Google doesn\u2019t honor <code>robots.txt<\/code> for delays.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-3-leverage-web-application-firewalls-waf-amp-cdns\">3. Leverage Web Application Firewalls (WAF) &amp; CDNs<\/h4>\n\n\n\n<p>Use <a href=\"https:\/\/www.cloudflare.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Cloudflare<\/a>, <a href=\"https:\/\/sucuri.net\/\" target=\"_blank\" rel=\"noreferrer noopener\">Sucuri<\/a>, or similar WAF\/CDNs to restrict malicious crawler traffic before it hits your site:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rate-limit or challenge suspicious user agents via <a href=\"https:\/\/docs.aws.amazon.com\/waf\/latest\/developerguide\/waf-rules.html\" target=\"_blank\" rel=\"noreferrer noopener\">WAF rules<\/a>.<\/li>\n\n\n\n<li>Use JavaScript verification (e.g. BotFirewall plugin) to block bots that can\u2019t execute scripts.<\/li>\n\n\n\n<li>WAF\/CDN can block entire IPs, countries, or user-agent patterns at the edge before they reach WordPress.\u202f<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-4-monitor-amp-audit-bot-access-regularly\">4. Monitor &amp; Audit Bot Access Regularly<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Review server logs to identify high-volume user agents and IPs.<\/li>\n\n\n\n<li>Use analytics and tools like <a href=\"https:\/\/www.screamingfrog.co.uk\/seo-spider\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Screaming Frog<\/a> or <a href=\"https:\/\/www.semrush.com\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">SEMrush<\/a> to monitor crawl spikes\u2014then throttle or block offending bots accordingly.<\/li>\n<\/ul>\n\n\n\n<p>You can protect your site from automated overload without sacrificing valid bot access or user experience. This layered protection ensures your site remains fast, secure, and cost-effective\u2014even when The Events Calendar generates thousands of hidden date-based pages.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\" id=\"h-overriding-default-seo-approaches\">Overriding Default SEO Approaches<\/h2>\n\n\n\n<p>We provide a handful of filters that allow you to prevent or change the meta tag additions on your views.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-tec-events-seo-robots-meta-include\">tec_events_seo_robots_meta_include<\/h4>\n\n\n\n<p>This filter allows you to globally change whether the meta tag gets included on pages.<\/p>\n\n\n\n<p>Here\u2019s an example that prevents meta includes.<\/p>\n\n\n\n<p><code>add_filter( 'tec_events_seo_robots_meta_include', '__return_false' );<\/code><\/p>\n\n\n\n<p>Here\u2019s an example that prevents meta includes for the list and day view:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'tec_events_seo_robots_meta_include', function( $do_include, $view ) {\n\n&nbsp;&nbsp;&nbsp;&nbsp;if ( in_array( $view, &#91; 'list', 'day' ] ) ) {\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;\n\n&nbsp;&nbsp;&nbsp;&nbsp;}\n\n&nbsp;&nbsp;&nbsp;&nbsp;return $do_include;\n\n}, 10, 2 );\n\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-tec-events-seo-robots-meta-include-view\">tec_events_seo_robots_meta_include_$view<\/h4>\n\n\n\n<p>This filter allows you to individually change whether the meta tag gets included on specific views.<\/p>\n\n\n\n<p>Here\u2019s an example that prevents the meta from being included in the month view:<\/p>\n\n\n\n<p><code>add_filter( 'tec_events_seo_robots_meta_include_month', '__return_false' );<\/code><\/p>\n\n\n\n<p>Here\u2019s another example that prevents the meta being included on the photo view from Events Calendar Pro:<\/p>\n\n\n\n<p><code>add_filter( 'tec_events_seo_robots_meta_include_photo', '__return_false' );<\/code><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-tec-events-filter-wp-robots-meta-directives\">tec_events_filter_wp_robots_meta_directives<\/h4>\n\n\n\n<p>This filter allows you to change the content attribute (i.e. <em>noindex, nofollow<\/em>) of the injected meta tags.<\/p>\n\n\n\n<p>Here\u2019s an example where we change the week view\u2019s content attribute to <em>noindex, follow<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'tec_events_filter_wp_robots_meta_directives', function( $robots ) {\n\t\t\n\t\t    $view = tribe_context()-&gt;get( 'view' );\n\t\t\n\t\t    if ( ! $view ) {\n\t\t\n\t\t        return $robots;\n\t\t\n\t\t    }\n\t\t\n\t\t    if ( $view !== 'week' ) {\n\t\t\n\t\t        return $robots;\n\t\t\n\t\t    }\n\t\t    \n\t\t\t$robots&#91;'noindex'] = true;\n\t\t\t$robots&#91;'nofollow'] = false;\n\t\t\n\t\t    return $robots;\n\t\t\n\t\t}, 10 );\n\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-tec-events-seo-robots-meta-allowable-post-types\">tec_events_seo_robots_meta_allowable_post_types<\/h4>\n\n\n\n<p>This filter allows you to change the post types that are allowed to have meta tags injected into them.&nbsp;<\/p>\n\n\n\n<p>Here\u2019s an example where we remove Venues from the list of allowable post types:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>add_filter( 'tec_events_seo_robots_meta_allowable_post_types', function( $post_types ) {\n\n&nbsp;&nbsp;&nbsp;&nbsp;return array_filter( (array) $post_types, static function() {\n\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $post_type !== \\Tribe__Events__Venue::POSTTYPE;\n\n&nbsp;&nbsp;&nbsp;&nbsp;} );\n\n}, 10, 2 );\n\n\n\n<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Improving SEO with The Events Calendar Within The Events Calendar, there are many links that impact SEO positively. Being a calendar, however, there can be situations where links and even whole pages should not be indexed\u2014an example being month view, which has the ability to paginate nearly infinitely. To improve SEO, The Events Calendar implements&#8230;<\/p>\n","protected":false},"author":84,"featured_media":1955565,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_swpsp_post_exclude":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"ep_exclude_from_search":false,"footnotes":""},"categories":[24,59],"tags":[204],"stellar-product-taxonomy":[161],"class_list":["post-1958534","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-customizing","category-php-function-snippets","tag-seo","stellar-product-taxonomy-the-events-calendar"],"acf":[],"taxonomy_info":{"category":[{"value":24,"label":"Customizations"},{"value":59,"label":"PHP Functions &amp; Snippets"}],"post_tag":[{"value":204,"label":"SEO"}],"stellar-product-taxonomy":[{"value":161,"label":"The Events Calendar"}]},"featured_image_src_large":["https:\/\/images.theeventscalendar.com\/kb\/uploads\/2023\/02\/social-share-1024x538.png",1024,538,true],"author_info":{"display_name":"The Events Calendar Team","author_link":"https:\/\/theeventscalendar.com\/knowledgebase\/author\/the_events_calendar_team\/"},"comment_info":0,"category_info":[{"term_id":24,"name":"Customizations","slug":"customizing","term_group":0,"term_taxonomy_id":24,"taxonomy":"category","description":"","parent":0,"count":40,"filter":"raw","term_order":"0","cat_ID":24,"category_count":40,"category_description":"","cat_name":"Customizations","category_nicename":"customizing","category_parent":0},{"term_id":59,"name":"PHP Functions &amp; Snippets","slug":"php-function-snippets","term_group":0,"term_taxonomy_id":59,"taxonomy":"category","description":"","parent":24,"count":32,"filter":"raw","term_order":"0","cat_ID":59,"category_count":32,"category_description":"","cat_name":"PHP Functions &amp; Snippets","category_nicename":"php-function-snippets","category_parent":24}],"tag_info":[{"term_id":204,"name":"SEO","slug":"seo","term_group":0,"term_taxonomy_id":204,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw","term_order":"0"}],"_links":{"self":[{"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/posts\/1958534","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/users\/84"}],"replies":[{"embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/comments?post=1958534"}],"version-history":[{"count":19,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/posts\/1958534\/revisions"}],"predecessor-version":[{"id":1969923,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/posts\/1958534\/revisions\/1969923"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/media\/1955565"}],"wp:attachment":[{"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/media?parent=1958534"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/categories?post=1958534"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/tags?post=1958534"},{"taxonomy":"stellar-product-taxonomy","embeddable":true,"href":"https:\/\/theeventscalendar.com\/knowledgebase\/wp-json\/wp\/v2\/stellar-product-taxonomy?post=1958534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}