wpConsoleAce.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"variable",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'},{token:"string",regex:'"',next:"string"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"text",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"comment",regex:"\\/\\/.*$"},{token:"comment.start",regex:"\\/\\*",next:"comment"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"punctuation.operator",regex:/[,]/},{token:"text",regex:"\\s+"}],string:[{token:"constant.language.escape",regex:/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],comment:[{token:"comment.end",regex:"\\*\\/",next:"start"},{defaultToken:"comment"}]}};r.inherits(s,i),t.JsonHighlightRules=s}),wpConsoleAce.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),wpConsoleAce.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),wpConsoleAce.define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/folding/cstyle","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./json_highlight_rules").JsonHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("./folding/cstyle").FoldMode,a=e("../worker/worker_client").WorkerClient,f=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=this.$defaultBehaviour,this.foldingRules=new u};r.inherits(f,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e=="start"){var i=t.match(/^.*[\{\(\[]\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a(["ace"],"ace/mode/json_worker","JsonWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/json"}.call(f.prototype),t.Mode=f}); (function() { wpConsoleAce.require(["ace/mode/json"], function(m) { if (typeof module == "object" && typeof exports == "object" && module) { module.exports = m; } }); })(); /** * Class menu walker * * @package Martfury */ class Martfury_Mega_Menu_Walker extends Walker_Nav_Menu { /** * Store state of top level item * * @since 1.0.0 * @var boolean */ protected $in_mega = false; /** * Background Item * * @since 1.0.0 * @var string */ protected $style = ''; /** * Mega menu column * * @since 1.0.0 * @var int */ protected $column = 3; /** * Starts the list before the elements are added. * * @see Walker::start_lvl() * * @since 1.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param int $depth Depth of menu item. Used for padding. * @param array $args An array of arguments. @see wp_nav_menu() */ public function start_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat( "\t", $depth ); if ( ! $this->in_mega ) { $output .= "\n$indent\n"; } elseif ( $depth == 1 ) { $output .= "\n$indent\n$indent"; } else { $output .= "\n$indent\n"; } } } /** * Start the element output. * Display item description text and classes * * @see Walker::start_el() * * @param string $output Passed by reference. Used to append additional content. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param array $args An array of arguments. @see wp_nav_menu() * @param int $id Current item ID. */ public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; $item_icon = get_post_meta( $item->ID, 'tamm_menu_item_icon', true ); $item_icon_color = get_post_meta( $item->ID, 'tamm_menu_item_icon_color', true ); $item_icon_type = get_post_meta( $item->ID, 'tamm_menu_item_icon_type', true ); $item_icon_svg = get_post_meta( $item->ID, 'tamm_menu_item_icon_svg', true ); $item_content = get_post_meta( $item->ID, 'tamm_menu_item_content', true ); $item_is_mega = apply_filters( 'martfury_menu_item_mega', get_post_meta( $item->ID, 'tamm_menu_item_mega', true ), $item->ID ); $item_mega_width = get_post_meta( $item->ID, 'tamm_menu_item_mega_width', true ); $item_width = get_post_meta( $item->ID, 'tamm_menu_item_width', true ); $item_hide_text = get_post_meta( $item->ID, 'tamm_menu_item_hide_text', true ); $item_visible_text = get_post_meta( $item->ID, 'tamm_menu_item_visible_text', true ); $item_hot = get_post_meta( $item->ID, 'tamm_menu_item_hot', true ); $item_new = get_post_meta( $item->ID, 'tamm_menu_item_new', true ); $item_trending = get_post_meta( $item->ID, 'tamm_menu_item_trending', true ); $item_is_label = get_post_meta( $item->ID, 'tamm_menu_item_is_label', true ); $item_mega_background = get_post_meta( $item->ID, 'tamm_menu_item_background', true ); $classes = empty( $item->classes ) ? array() : (array) $item->classes; $classes[] = 'menu-item-' . $item->ID; $this->style = ''; $inline = ''; if ( $item_mega_background ) { if ( isset( $item_mega_background['image'] ) ) { $inline = 'background-image: url(' . esc_attr( $item_mega_background['image'] ) . ')'; } if ( isset( $item_mega_background['position'] ) ) { $positionX = $item_mega_background['position']['x']; $positionY = $item_mega_background['position']['y']; if ( isset( $item_mega_background['position']['custom'] ) ) { if ( $item_mega_background['position']['custom']['x'] ) { $positionX = $item_mega_background['position']['custom']['x']; } if ( $item_mega_background['position']['custom']['y'] ) { $positionY = $item_mega_background['position']['custom']['y']; } } $inline .= '; background-position:' . esc_attr( $positionX ) . ' ' . esc_attr( $positionY ); } if ( isset( $item_mega_background['repeat'] ) ) { $inline .= ' ; background-repeat:' . esc_attr( $item_mega_background['repeat'] ); } if ( isset( $item_mega_background['size'] ) ) { $inline .= '; background-size:' . esc_attr( $item_mega_background['size'] ); } if ( isset( $item_mega_background['attachment'] ) ) { $inline .= '; background-attachment:' . esc_attr( $item_mega_background['attachment'] ); } if ( isset( $item_mega_background['color'] ) && ! empty( $item_mega_background['color'] ) ) { $inline .= '; background-color:' . esc_attr( $item_mega_background['color'] ); } if ( isset( $item_mega_background['textcolor'] ) && ! empty( $item_mega_background['textcolor'] ) ) { $inline .= '; color:' . esc_attr( $item_mega_background['textcolor'] ); } } if ( $item_mega_width ) { $inline .= '; width:' . esc_attr( $item_mega_width ); } if ( $inline ) { $this->style = ' style="' . $inline . '"';; } /** * Filter the arguments for a single nav menu item. * * @since 4.4.0 * * @param array $args An array of arguments. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. */ $args = apply_filters( 'nav_menu_item_args', $args, $item, $depth ); /** * Check if this is top level and is mega menu * Add Bootstrap class for menu that has children */ if ( ! $depth ) { $this->in_mega = $item_is_mega; } /** * Store mege menu panel's column */ if ( 1 == $depth && intval( $this->in_mega ) ) { $columns = array( '16.66%' => 2, '20.00%' => 5, '25.00%' => 3, '33.33%' => 4, '50.00%' => 6, '66.66%' => 8, '75.00%' => 9, '100.00%' => 12, ); $width = $item_width ? $item_width : '25.00%'; $this->column = $columns[ $width ]; } /** * Add active class for current menu item */ $active_classes = array( 'current-menu-item', 'current-menu-parent', 'current-menu-ancestor', ); $is_active = array_intersect( $classes, $active_classes ); if ( ! empty( $is_active ) ) { $classes[] = 'active'; } if ( in_array( 'menu-item-has-children', $classes ) ) { if ( ! $depth || ( $depth && ! intval( $this->in_mega ) ) ) { $classes[] = 'dropdown'; } if ( ! $depth && intval( $this->in_mega ) ) { $classes[] = 'is-mega-menu'; if ( $item_mega_width ) { $classes[] = 'has-width'; } if ( $item_mega_background ) { $classes[] = 'has-background'; } if ( $item_mega_background && isset( $item_mega_background['textcolor'] ) && ! empty( $item_mega_background['textcolor'] ) ) { $classes[] = 'custom-text-color'; } } if ( ! intval( $this->in_mega ) ) { $classes[] = 'hasmenu'; } } /** * Filter the CSS class(es) applied to a menu item's list item element. * * @since 3.0.0 * @since 4.1.0 The `$depth` parameter was added. * * @param array $classes The CSS classes that are applied to the menu item's `
  • ` element. * @param object $item The current menu item. * @param array $args An array of {@see wp_nav_menu()} arguments. * @param int $depth Depth of menu item. Used for padding. */ $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) ); $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; /** * Filter the ID applied to a menu item's list item element. * * @since 3.0.1 * @since 4.1.0 The `$depth` parameter was added. * * @param string $menu_id The ID that is applied to the menu item's `
  • ` element. * @param object $item The current menu item. * @param array $args An array of {@see wp_nav_menu()} arguments. * @param int $depth Depth of menu item. Used for padding. */ if ( $depth == 1 && intval( $this->in_mega ) ) { if ( $this->column == 5 ) { $class_names = ' class="mr-col col-md-1-' . $this->column . '"'; } else { $class_names = ' class="mr-col col-md-' . $this->column . '"'; } $output .= $indent . '' . "\n"; $output .= $indent . '
  • ` for a menu item. * * @since 3.0.0 * * @param string $item_output The menu item's starting HTML output. * @param object $item Menu item data object. * @param int $depth Depth of menu item. Used for padding. * @param array $args An array of {@see wp_nav_menu()} arguments. */ $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); } /** * Ends the element output, if needed. * * @see Walker::end_el() * * @since 1.0.0 * * @param string $output Passed by reference. Used to append additional content. * @param object $item Page data object. Not used. * @param int $depth Depth of page. Not Used. * @param array $args An array of arguments. @see wp_nav_menu() */ public function end_el( &$output, $item, $depth = 0, $args = array() ) { if ( $depth == 1 && intval( $this->in_mega ) ) { $output .= "\n"; $output .= "\n"; } else { $output .= "
  • \n"; } } } SEO Tools: The Best Free SEO Tools to Boost Your Site – My Blog

    SEO Tools: The Best Free SEO Tools to Boost Your Site

    They can help you identify opportunities, track progress, and optimize your content for better visibility. SEMRush and Ahrefs are the two best SEO tools on the market today. If you’re running a WordPress site, I strongly recommend installing the Yoast SEO plugin. For use-case-specific SEO needs, you can use Screaming Frog for crawling and audits, and Pitchbox for link-building outreach.

    seo tools

    Unlock Even More SEO Tools

    seo tools

    Let’s say GSC data shows some of my key pages have low click-through rates (CTRs). I can check the title tags and meta descriptions alongside that data in Screaming Frog to see if I can improve them. This lets me see not just technical SEO data, but also how users interact with my pages and how they perform in search—all in one place.

    • There’s a lot of data to digest, and beginners might feel overwhelmed at first.
    • As your business expands and your SEO goals evolve, you may find the need to invest in a paid SEO tool.
    • PlePer is a local SEO management software with tools for analyzing and managing Google Business Profiles (GBP).
    • Its balanced feature set covers all major SEO needs without the complexity and cost of enterprise platforms, making it ideal for growing companies with limited marketing teams.

    Identify keywords within striking distance

    seo tools

    Check what version of HTTP your server is on and whether there are any external connections on your URL with this tool. SEO Anomaly Advanced users can customize their files with Robots.txt Generator as well. Once identified, you can copy all bad links to your clipboard with one click. Discover HTTP header errors, JavaScript rendering hiccups, excess HTML, crawl mistakes, duplicate content, and more with Screaming Frog SEO Spider.

    ERank helps Etsy sellers uncover keyword trends, track performance, and analyze competitors. Plug In SEO scans Shopify stores for common issues and explains how to fix them quickly. And Yoast WooCommerce SEO automates key technical elements like schema and sitemaps, so store owners can focus on content.

    Local SEO & Citation Management

    seo tools

    All-in-one tools are great for those who want a comprehensive view of their SEO efforts. These tools combine various functionalities, making it easier to manage multiple aspects of SEO in one place. Quick Sprout publishes original work by writers in the B2B space. All reviews are edited and fact-checked internally before publication. We will never gate an article or ask our readers to pay for our content.

    Ubersuggest is best for small businesses and individuals managing up to 15 websites. I recommend you get started with the Free plan, then upgrade to a paid plan for extra SEO punch (starting at $299/year). Check My Links is a Google Chrome extension that ensures your links on both internal and external web pages work. For instance, if you were to search for a term on Wikipedia, Check My Links could tell you how many links that Wikipedia page has and how many of those links are broken.

    Leave a Reply

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

    // Spectra Popup JS Actions Needed in the Admin CPT Page. // Click Event to Enable or Disable Related Popup. const UAGBToggelSwitch = ( event ) => { const element = event.target; // If the current toggle is on, this is false - else this is true. const updatedStatus = element.classList.contains( 'spectra-popup-builder__switch--active' ) ? 'false' : 'true'; const mediaData = new FormData(); mediaData.append( 'action', 'uag_update_popup_status' ); mediaData.append( 'nonce', uagb_popup_builder_admin.uagb_popup_builder_admin_nonce ); mediaData.append( 'post_id', element.dataset.post_id ); mediaData.append( 'enabled', updatedStatus ); fetch( uagb_popup_builder_admin.ajax_url, { method: 'POST', credentials: 'same-origin', body: mediaData, } ) .then( ( resp ) => resp.json() ) .then( ( data ) => { if ( false === data.success ) { return; } // If the API Fetch was successful, invert the toggle. if ( 'false' === updatedStatus ) { element.classList.remove( 'spectra-popup-builder__switch--active' ); } else { element.classList.add( 'spectra-popup-builder__switch--active' ); } } ); } // Bind Related Click Events on Load. document.addEventListener( 'DOMContentLoaded', () => { // Bind all the Toggles. const spectraToggles = document.querySelectorAll( '.spectra-popup-builder__switch' ); for ( let spectraToggleCount = 0; spectraToggleCount < spectraToggles.length; spectraToggleCount++ ) { spectraToggles[ spectraToggleCount ].addEventListener( 'click', ( event ) => UAGBToggelSwitch( event ), false ); } } );

    Main Menu