Above is the cover of the original Snapfish book which Vincenzina (Wynne) made with loving care for her family to answer their questions “Nonna how do we make that?”.
Nonna Wynne’s book is so good that one day you may be able to buy it anywhere. But not today. Today, unless you know Wynne personally or stumble across it in a Dee Why village shop, you’re out of luck except HERE at authors-books.
Please don’t waste your time on trying to do a price comparison – you’re not going to find “from Nonno’s garden to Nonna’s kitchen” anywhere else online. This is it. At least, for the moment. For this edition. But – Breaking News – “from Nonno’s garden to Nonna’s kitchen” is already into the second printing, less than a month after it’s first release.
Go down a Blind Alley? – Na Na Na Na Na Na Na
Have you read about the Google Books Blind Alley? Look, we’ve offered to help. Had we managed to be heard, then we would have notified Google Books via our suggested Advise Google form. So simple, but, ah well? Meanwhile for simple but delicious recipes, go into the kitchen with Nonna Wynne.
So the last word goes to Wynne and Tony
These simple yet stunning culinary delights of southern Italy, in the region of Reggio Calabria, are passed down through countless generations. They come together and will offer comfort and inspiration for many generations to come.
The back cover of “from Nonno’s garden to Nonna’s kitchen” with Tony and Wynne
I hope you enjoy eating this food as much as I have enjoyed bringing these traditional recipes from Nonno’s garden to Nonna’s kitchen.
This is episode 3 of our Google education effort. Have you read episode 1, Global Ghosts Afterlife? Therein we explore some difficulties you may encounter if you change your domain name. In episode 2 Google Ghosts Trap we look at another manifestation of ectoplasm in which authors-book has become enmeshed.
Just do any internet search for Molly Moo from Mollymook and the page 1, probably number 1, result will be authors-books.
But, search for Molly Moo from Mollymook with either classic Google Books, or the new Google Books and the results will be of no help at all for you to purchase the book.
The problem is clear to see. Google Books is looking in the wrong place for many books. So classic Google Books is implying that Amazon, Booktopia, Dymocks and Fishpond might be good places to look and the new Google Books is offering Barnes & Noble, Books-A-Million and Amazon. But authors-books can tell you, you’re wasting your time, because at authors-books we personally know the author and know that we are now the sole stockist.
We’d be happy to so inform Google Books if only there was a way to do so. A way for the Ant to talk to the Elephant. Surely, it wouldn’t be difficult if the Elephant, with his big beautiful ears and sensitive trunk, just decided to reach out and listen?
Google Books Blind Alley Two
This is Michael- front cover
While Google Books was no help to someone wanting to purchase Molly Moo from Mollymook, or indeed any of the other titles by Sue Hays, at least it mentioned Monty the Mutt from Milton and Peppy the Paint from Pigeon House as other titles by the author.
Able Golden Book Awards 2025 Nominated This is Michael by D J Hammond
This is Michael is an entrant in the Able Golden Book Awards 2025. The author, Dian Hammond has been notified that This is Michael is a Finalist in the Awards.
Google Books Blind Alley Three
The cover of The Cheeky Possum
The concept for authors-books came about on discovering the difficulty of distributing a book other than through well established publisher to distributor to wholesaler to bookshop relationships. Also, on hearing some of the difficulties of self-publishing and worse, vanity publishing.
This reality was kindly explained to us by John at The Book Room Collective in Byron Bay. On vacation enjoying the Queensland sunshine, it was time to dream. What crystallised you can read here about us authors-books.
Yet, while all three books can be found through Google Books, yet again it is a Google Books Blind Alley. There is NO useful suggestion on where these books can be purchased. We did try to give feedback to Google Books, pointing out that Google’s own search engine has no difficulty finding these titles, usually number 1 on page 1, for purchase at authors-books. But sadly, at Google the left hand does not know what the right hand is doing. While this is laudable for carrying out works of charity (Matthew 6:3), surely it is tiresome when the Google Books claim is to be able to “Search the world’s most comprehensive index of full-text books.”
Please Let Us Educate the Elephant
A form to advise Google Books about a title
The elephant, with a long memory, so beautiful, wise and knowledgeable, please let us educate you. Please don’t be a Google Books Blind Alley, we’d like to help. It wouldn’t be difficult would it? Just a simple form.
❤️😘😍 🙏🙏🙏 🐘🐘🐘 🎆🎆🎆
Google Books Blind Alley No More
Google Books, you can be in the vanguard! Do not be the Google Books Blind Alley. Be the Elephant that lets the Ants help you. Be all hearing, all seeing of:
New models of book distribution
Country based and regional booksellers
Community publishing groups and enterprises
authors-books is a new paradigm online book seller
Although not always consciously recognized, book publishing and distribution is a lottery for new authors. Works of great distinction can be unrecognized for years, decades or lifetimes.
Dip into Authors’ Books and who knows what treasure you will find from an author determined to speak?
When you buy a book here many of our authors will send you a signed copy with the personal inscription you ask for!
Are you an author who would like to have your book(s) for sale here? Please read about The Authors’ Community which tells you how you can apply.
Country based and regional booksellers
As noted above in Google Books Blind Alley Two, people can buy This Is Michael in Ballarat, Victoria, Australia at Collins Booksellers. Wouldn’t it be helpful if that possibility was presented by Google Books? Why not? Why not indeed. We have here suggested the solution for greatly enriching Google Books with missing information encompassing country based and regional booksellers to make Google Books so much better.
Community publishing groups and enterprises
We were recently inspired by another example of Changing Australia on hearing about Kids’ Own Publishing. How wonderful if all the books at this and other community endeavours were findable through Google Books. And once more the left hand hasn’t let the right hand know what it’s doing.
So we just picked the first book, A Quack in Time, in the Kids’ Own Publishing Book Shop. You can do the Google search for the title. Yes there it is at search result number 1, the book launch. And at number 3 on Instagram. Kids’ Own Publishing is professional, they’ve done the hard yards and certainly would have told Google Books had they had access to the Google Books Index Advice. Simple as ABC Alphabet. Go get’m Google.
authors-books Google Education Series
Past episodes
Have you read episode 1, Global Ghosts Afterlife? Therein we explore some difficulties you may encounter if you change your domain name. In episode 2 Google Ghosts Trap we look at another manifestation of ectoplasm in which authors-book has become enmeshed.
Future episodes?
Maybe. Currently considering our struggles with the Google Merchant Center.
This is episode 2 of our Google education effort. Have you read episode 1, Global Ghosts Afterlife? Therein we claimed and explained that our site essentially didn’t have 404 not found errors. To get the SEO right we are using Rank Math SEO, and with the advent of the Global Ghosts, it was time to turn on a module for which we thought we had no use, the 404 monitor.
Parapsychology and the Image Proxy
How do ghosts multiply? Surely we had laid the global ghosts and the google ghosts revealed in the Google Search Console by redirection to the afterlife? So our 404 monitor should be clean apart from the haphazard? But, Oh dear, no! So many entries and with common characteristics. So let’s look at this one ,,,
many of the references are to folder wp-content and the file extension is jpg, so these are images.
the user agent refers to (via ggpht.com GoogleImageProxy). What’s that?
can we actually return the image from the Internet Archive? (see episode 1).
Extraterrestrial: Google Phone Home
So the User Agent says: (via ggpht.com GoogleImageProxy) and if you Google search “ggpht.com GoogleImageProxy” one of the results at the time of writing is Dealing with false opens in Gmail It seems you would have to be an email marketing expert to make much sense of the findings in that article. But one thing is clear, this is the published Google Image Proxy. BUT, sometimes, the image proxy is looking in the wrong place for the image and receiving a 404 not found response.
Looking in the right place, here is the image you would see based on the URI and using a little bit of work with the WaybackMachine.
Cover of The Girl with the Dragon Tattoo by Stieg Larsson
What we intend people to see for the time being, is this:-
A fan model of a Ghost Trap as featured in the 1984 Ghostbusters film
In other words, a direction to this post which gives guidance as to where you might find the original image of the cover of The Girl with the Dragon Tattoo by Stieg Larsson.
Past Lives and the Paranormal
So we know that authors-books had a past life and the image of the cover of The Girl with the Dragon Tattoo by Stieg Larsson is an artifact of that past life. These observations emerge in the context of our difficulties with Google search, where we’ve gone from hero to zero, we believe and intend to prove, through no fault of ours (we’re still on page 1 in Bing search and DuckDuckGo, etc) And while Google features large in our observations because of the image proxy and wide adoption of Gmail, this is in fact another global problem. So authors-books would like to suggest a global solution.
The Global Ghost Code
Wikipedia has a list of HTTP status codes. The 4xx rage are client errors. Some people have suggested in cases like that above, the site should return 410, sometimes described as content deleted. But that’s not true. On the current incarnation of the website it never existed.
Would love to have come up with a clever suggestion for the code, as in 451 Unavailable for Legal Reasons, a reference to the novel Fahrenheit 451. Ideas please. But in the meantime, what about:
452 Property of a Previous Owner of the Domain Name
This request probably relates to a page or image from a website established by a previous owner of the domain name. It has never been available on the website of the present owner of the domain name. The page or image may be available at the Internet Archive on the WaybackMachine.
452 – a solution for generations to come
Alphabet, please get behind this idea. When Google Image Proxy or any other system receives a 452 response there’s constructive action to be taken. Perhaps automatically trying the Internet Archive? Whatever, the world has been given a more meaningful response.
Much more to come …
This is the end of episode 2 of our Google Education series. So much more to say, so episodes 3, 4, … coming. And we know we’re doing our SEO well because we’re on top of page 1 in Bing, DuckDuckGo, etc. with searches where we’re nowhere in the Google results!
The Previous and Next Episode
Update 2nd October 2025. Hurray, we’re now found in Google searches. We changed nothing, but Google Search has caught up. The previous episode Global Ghosts Afterlife published 16th October 2024. The next episode Google Books Blind Alley published 18th October 2025.
An inspiration. Glenda perceives the light and hope in every situation however dark the surface appearance.
I’m full of admiration for Glenda’s tenacity. How in so many spartan situations, whatever the challenges, did Glenda keep her diary in order to recount these glorious adventures? So impressed.
The advice for some time had been, that to achieve our goal, we needed the right brand. As a micro startup, to set things in motion, we’d gone with our business name Data Stream World and we took the domain name datastream.world. Yes that’s a new top-level domain (TLD .world). And we said the brand was Author Direct Bookshop, but, it never did seem right.
Then when Facebook become Meta, Google become Alphabet and Twitter become X, we wondered why can’t Data Stream World become Author’s Books? We were delighted to find that the domain name authors-books.com was available. Wow! An actual .com that’s completely the brand. New logo, move the site to the new domain name and we’re away. Or so we thought.
With our old domain name, if you searched in Google for a book title on our site we were always number 1 or 2 in the search results. Yes, we’d got the SEO right using Rank Math. Then why with the new domain name and an otherwise identical site are we nowhere? Literally nowhere! This post is just one part of the story of our effort to find the answer.
Google Ghosts
Our site doesn’t have 404s. Yes, well if you key the URL ‘authors-books.com/nonsense’ you will get a 404 response. That’s a real 404. But Google Search Console should not be getting 404 responses. It never did with the original domain name of datastream.world. And we regularly run a link checker. So, what’s going on?
Why are we receiving emails from Google Search Console telling us there are reasons pages are not being indexed? Really didn’t happen before. Better take a look. Horror!
There’s this bunch of URLs (see image below captioned ‘Google Ghosts Cellar URLs labelled vintage authors-books.com’) that have never been on our site. We’ve never heard of them!
And into the bargain the URLs are HTTP. Our sites, datastream.world and authors-books.com have always been HTTPS. We’re talking about current professional websites after all.
Google Ghosts Cellar URLs labelled vintage authors-books.com
Internet Archive
Ah! So perhaps this domain name belonged to someone else before? But, why on earth has Google Search Console associated that data with our Google account? After all, we’ve had to jump through hoops proving we own the domain.
Now experience tells us, we’re seldom alone with a problem. So, we go ahead with a (yes) Google search “404 previous owner URL”. And there they all are, people experiencing the same issue. At least one of the entries refers to the Wayback Machine.
So, we pop one of the URL’s into the Internet Archive and there it is.
AUTHORS-BOOKS.COM from the Wayback Machine
Now some of the “experts” advising worried site owners give advice that Google Search Console has a very busy bot and it may not be that speedy in forgetting old memories and getting up to date. Heavens above! This capture was made only once in 2010CE. Apparently, the site became unreachable not long after.
Current XML Sitemap
Our site has an excellent XML site map generated by Rank Math. We don’t think we ever explicitly submitted to Google Search Console a site map with our original domain name datastream.world. Perhaps, Google Search Console found it, or Rank Math submitted it, we’re not sure, but the end result was top rankings for the titles on our site.
However, some of the “expert” advice talked about submitting a sitemap to Google Search Console, so we looked to do that. Unbelievable, there was a site map that never was on our site, submitted over ten years ago with all these non-existent HTTP URLs! By what misguided mechanism did it become associated with our site?
We instructed Google Search Console to drop this ghost, hoping things would improve. But no. It seems these ghost URLs are very difficult to lay. How ironic that one of the titles was “Dark Life by Kat Falls”. Time for ghost busting! So here we are, we now have redirections from those URLs to this page.
Global Ghosts and Google Ghosts
Global Ghosts are references to no longer existing pages. The page might not exist for a variety of reasons. One of these reasons is that the domain name ownership is not renewed and has reverted to an available name with the domain registrar. That’s an artefact of the domain name system.
Google Ghosts as found in the Google Search Console look like cobwebs that need to be swept away. Is there not an opportunity when the proof of ownership of the domain name takes place to ask whether any data held by Google Search Console is still relevant to the website of the new domain owner? Then, at that time, Google Search Console has a chance to sweep the cellar clean if that’s what’s desirable.
Backlinks
In the hope of mutual benefit and the possible continuing power of backlinks we’ll happily list your site here if you too have suffered from the afterlife of Google Ghosts. Please send an email subject “Google Ghosts Afterlife backlink” to webmaster@authors-books.com. Please include the URL where we can view your link to this post. Also a few words you’d like to go with our link to you and the URL you’d like us to reference.
The Next Episode
This is the end of episode 1 of our Google Education series. Episode 2 ‘Google Ghosts Trap‘ published March 2025.
Most users of a WooCommerce site will have the default customer role which does not provide access to the backend where a user’s Avatar Privacy settings can be found. So, there is a need to provide the user with a settings form in the frontend. From the Avatar Privacy Changelog we see that release 2.3.0 provides a shortcode [avatar-privacy-form] to allow for Avatar Privacy settings on the frontend of a site. This article explains how we have exploited this to integrate Avatar Privacy within the default WooCommerce dashboard.
Our site does not offer product downloads (we sell physical books), so we have used the ‘Downloads’ tab in the My Account dashboard and changed it to ‘Avatar’. However, there are steps you can take to add an additional tab for ‘Avatar’ in the ‘My Account’ dashboard if that’s what you need to do. Such variations are covered later when we discuss adding the ‘Delete Me’ plugin and a frontend form for user self deletion.
Steps for the GDPR Useful ‘Avatar Privacy’ Form
Install and activate the Avatar Privacy plugin.
Because we are using the ‘Downloads’ tab in the ‘My Account’ dashboard we copied the WooCommerce plugin file named ‘downloads.php’ from folder ‘templates/myaccount’ and placed it appropriately in our child theme. The only code needed in this file is: <?php echo do_shortcode( '[avatar-privacy-form]' );
Guided by How to Customize a My Account Page in WooCommerce under heading ‘Method 1: Customizing My Account page in WooCommerce using WooCommerce hooks’. To change the menu tab name and icon we did the following with filter woocommerce_account_menu_items:
In the $menuOrder array, we changed the ‘downloads’ value so that the tab description reads ‘Avatar’: 'downloads' => __( 'Avatar', 'woocommerce' ),
we added the following to style.css in our child theme: .woocommerce-MyAccount-navigation ul li.woocommerce-MyAccount-navigation-link- -downloads a::before { content: "f2bd"; } This shows the Font Awesome user-circle icon in place of the previous downloads icon.
We changed the ‘Dashboard’ tab description about what you can do from the account dashboard. So, we copied file named ‘dashboard.php’ from folder ‘templates/myaccount’ and placed it appropriately in our child theme. Then the code change in this file was to replace: printf( __( 'From your account dashboard you can view your <a href="%1$s">recent orders</a>, manage your <a href="%2$s">shipping and billing addresses</a>, and <a href="%3$s">edit your password and account details</a>.', 'woocommerce' ), esc_url( wc_get_endpoint_url( 'orders' ) ), esc_url( wc_get_endpoint_url( 'edit-address' ) ), esc_url( wc_get_endpoint_url( 'edit-account' ) ) ); with the following: printf( __( 'From your account dashboard you can view your <a href="%1$s">recent orders</a>, manage your <a href="%2$s">shipping and billing addresses</a>, edit your <a href="%3$s">password and account details</a> or manage your <a href="%4$s">avatar</a>.', 'woocommerce' ), esc_url( wc_get_endpoint_url( 'orders' ) ), esc_url( wc_get_endpoint_url( 'edit-address' ) ), esc_url( wc_get_endpoint_url( 'edit-account' ) ), esc_url( wc_get_endpoint_url( 'downloads' ) ) );
The above steps complete our changes to make the Avatar Privacy form available within the ‘My Account’ dashboard in place of ‘Downloads’. If you would like to see the changes in action please go to the authors-books site and register. Don’t worry, you will be able to delete your account immediately! That’s because, further in the spirit of GDPR, we have implemented a ‘Delete Me’ form in the ‘My Account’ dashboard.
So to implement the ‘Delete Me’ form we now required an additional tab in the ‘My Account’ dashboard as there wasn’t a further one we could repurpose.
Steps for the GDPR Useful ‘Delete Me’ Form
Password confirmation needed before a user can delete their account
Here’s what to do to implement the GDPR useful ‘Delete Me’ form.
Under heading ‘Roles’, select the roles that can delete themselves according to what’s appropriate for your site.
Under heading ‘Shortcode’:
check ‘Use Form Instead of Link’
in the form we changed: WARNING!<br /><br /> Are you sure you want to delete user %username% from %sitename%? to be: WARNING: Account Deletion Imminent.<br /><br /> Are you sure you want to delete user %username% from %sitename%? as we thought that was clearer. Don’t forget to ‘Save Changes’.
Under heading ‘Miscellaneous’:
We chose ‘Delete Comments’ which seems consistent with the right to be forgotten.
We chose ‘E-mail Notification’ since our administration is notified when a user registers, so this complements that registration by notify administration of the deletion.
There is a lot of material on the topic of adding a new tab in the ‘My Account’ dashboard and we tried much of it with partial success. In the end the answer for us was found at heading “Adding a Custom Endpoint” within Change, Edit & Rename WooCommerce Endpoints in My Accounts Page. Following the advice there we modified the code in the easily identified places suggested:
Changing “My Stuff” to “Delete My Account” for the tab description and “Delete This Account” for the page title: // Insert your custom endpoint. $items[ self::$endpoint ] = __( 'Delete My Account', 'woocommerce' ); // New page title. $title = __( 'Delete This Account', 'woocommerce' );
We called our endpoint ‘account-delete’: public static $endpoint = 'account-delete';
For the endpoint content you probably need to use a version of the plugin shortcode using opening and closing tags. This accommodates the case where not all roles are authorized to delete themselves. For our case, only subscribers and customers are allowed to self delete. So, for the endpoint content we have: /** * Endpoint HTML content. */ public function endpoint_content() { echo do_shortcode( "[[plugin_delete_me] Your role is not one that allows self deletion. Please use the 'Contact Us' facility under 'More Company Information' to request that your account be deleted. [/plugin_delete_me]]" ); } This results in the ‘Delete Me’ form being displayed for roles that are allowed to self delete and for others the message in the shortcode content is displayed.
Then it is suggested we add the modified code as a plugin. Consequently, we did this:
Created a folder called ‘my-account-delete’ within the ‘plugins’ folder.
Named our modified code ‘my-account-delete.php’ and saved it within the new folder.
From WooCommerce Endpoint Order and Rename – My Account Page v2.6+ we see in the comments that users are having trouble making this code take effect. A suggestion was to include the code in ‘functions.php’, which contradicts having it as a plugin. So we deleted the statement: newMy_Custom_My_Account_Endpoint(); from ‘my-account-delete.php’ and placed that statement in our theme’s ‘functions.php’ so that we’re invoking the constructor there.
Then we looked for the plugin name ‘WooCustom My Account’ in our Plugins and activated it.
To use the Font Awesome user-slash icon we added to style.css in our child theme: .woocommerce-MyAccount-navigation ul li.woocommerce-MyAccount-navigation-link- -account-delete a::before { content: "f506"; }
Desktop look with background image (left) or high contrast (right)
Why and How We Toggle the Background
For reasons related to the origin of our site we want to keep our background image although for readability it is less than ideal. So the question was, how do we enable the user to effortlessly hide the background image if they wish to improve the contrast of the page?
As our site uses WooCommerce, for small mobile screens we wanted to have our ‘Contrast’ button in the handheld footer menu.
While the button would say ‘Contrast’, we thought a, not to be missed, tooltip was necessary. Also a tooltip that would, in some way, cope with the absence of hover on touch screens was desirable.
Then it seemed that once the background image was hidden, the new state should apply to all newly opened tabs. This was achieved through the use of a cookie. Indeed, the background image state would apply consistently in the browser until the cookie expired after a day.
How we implemented each of the above goals is described in the following sections.
There’s quite a lot of JavaScript code to follow in this. If you’d like to see the completed code this can be done using the Chrome Developer Tools. Look at the ‘Sources’ tab and find the file ‘https://authors-books.com/wp-content/uploads/siteground-optimizer-assets/custom-js.min.js’. This is a minified file, however, there is a pretty-print icon ‘{ }’ in the footer of the code window that allows you to see the formatted code. Update 4 May 2021. To look at the particular file you need to be logged in, but no problem, just register and when you’ve finished, there’s a ‘Delete My Account’ option in the Dashboard. We’ll forget all about you!
Steps for a Floating ‘Contrast’ Button
Guided by one of many posts on the topic of a floating button, we added the following to the style.css file in our child theme. #contrast_button { position: fixed; z-index: 99999; right: 20px; top: 100px; } For the button to be mouse sensitive we found we needed a large z-index. The value of 99999 is arbitrary and effective. (Our effort to find the highest z-index in use in the stacking context was disapointingly fruitless.)
We also copied header.php to our child theme and included, as a new <div> after #content, the following: <div id="contrast_button" class="a_contrast"> <a id="a_contrast" href="javascript:void(0);" title="Toggle background image.">Contrast</a> </div>
We don’t want the anchor click to take us anywhere, so the href we’ve used is explained in “Is an empty href valid?“.
However, so far the anchor does not look like a button. So we added this style.css in our child theme:
/* make the link look like a button */ #contrast_button{ border: 1px solid black; border-radius: 5px; padding: 0px 3px; background-color: #E3E3E3; }
When we click the button we want to hide the background image. An inspection of page source or the article How To Properly Add Background Images To Your WordPress Site tells us that we need to remove the css for the class custom-background and replace it with other css that we’ve called custom-contrast. So we added this css to our child theme style.css: /* Toggled values to replace custom-background */ .custom-contrast{ background-image:none; background-color: #E3E3E3; } Then, following the up-voted code in Changing background color in wordpress with a button so that these values toggle when we click the button, we added the following to our custom.js file (we’re using the theme-customisations plugin): jQuery(function($){ $("#contrast_button").on("click", function(e){ e.preventDefault(); $('body').toggleClass( 'custom-background custom-contrast'); }); });
And that’s all that’s necessary for the floating button.
Handheld Footer Bar ‘Contrast’ Button
Mobile look with background image (left) or high contrast (right)
Guided by Customize links in the handheld footer bar we added the following to our functions.php: /* * Add a link in the handheld footer bar */ add_filter( 'storefront_handheld_footer_bar_links', 'add_contrast_link' ); function add_contrast_link( $links ) { $new_links = array( 'contrast' => array( 'priority' => 10, 'callback' => 'contrast_link', ), ); $links = array_merge( $links, $new_links ); return $links; } function contrast_link() { echo '<a id="contrast_bar_button" href="javascript:void(0);" title="Tap to toggle background image.">' . __( 'Contrast' ) . '</a>'; } This is enough to add the link in the footer bar, but we do not yet have an icon. So, additionally we need to add to style.css: .storefront-handheld-footer-bar ul li.contrast > a:before { content: "f042"; }
For the footer bar button to do the same action as the contrast button, we just need to add its selector to the line: $("#contrast_button").on("click",function(e){ to become: $("#contrast_button, #contrast_bar_button").on("click", function(e){
And lastly, we needed to turn off the ‘Contrast’ button in the page body, so we added this to style.css: /* don't display the contrust button on handheld */ @media only screen and (max-width:768px){ #a_contrast, .a_contrast { display: none !important; } }
And that’s all that’s necessary for the footer bar button.
Adding a Big Tooltip to the ‘Contrast’ Button
For the tooltip we followed the post Responsive and Mobile-Friendly Tooltip. So firstly we added the attribute rel="tooltip" to our anchor elements (id’s a_contrast and contrast_bar_button) above.
Then, we wanted the tooltip:
to automatically disappear after 3 seconds.
to show itself on page load, so attention is drawn to the button.
So we included the CSS as shown in the post in style.css, except for small variations as shown here: #tooltip { text-align: center; color: #fff; background: #0000FF; position: absolute; z-index: 99999; padding: 15px; border-radius: 5px; } Here we’ve chosen a different background colour, we needed to increase the z-index and we choose rounded corners.
We included the JavaScript largely as shown, but with the following changes for 1a and 1b above and since we already have document ready handling, then c below:
We added, at the end of the init_tooltip function, a timeout, thus: window.setTimeout(remove_tooltip, 3000);
The changes for the on page load tooltip display are fivefold:
we named the function bound to the variable targets using a function expression, thus: var show_tip = function()
So now we have (noting that .bind is, sort of, deprecated), to keep the original functionality: targets.on( 'mouseenter', show_tip);
Then we added after the above line of code: show_tip(); in order to show the tooltip on page load, however, there is a problem, because the object this is the window object and not the button clicked.
So how to select the button? Well the buttons are held in the variable targets and in our case only one is visible, either the floating button or the footer bar button. So which is visible? Guided by How to check an element is visible or not using jQuery this is how we found out: var vis; $(targets).each(function (index, element){ if ($(element).is(":visible")){ vis = element; return false; }; }); So now we know which button element is visible and thus the button we should tooltip when this is the window object.
This is how we test if this is the window object, so accordingly we evaluate: this != null && this === this.window Hence we replaced: target = $(this); with: target = $( (this != null && this === this.window)? vis : this );
We removed the construct: $( function() { < // code we keep > }); since we already have a document ready construct: jQuery( function($) { // Our toggleClass code }); so we included all our code within this later construct.
And that’s all that’s needed for the footer bar ‘contrast’ button.
Our cookie was generally to have a value of ‘low’ or ‘high’ corresponding to the contrast states of, background image showing, and no background image, respectively. However, we introduced an initial state of ‘init’ which allowed us to show our tooltip for longer when the cookie was created.
Update 22 May 2020. With the buzz around Chrome’s cookie SameSite policy rollback in the COVID-19 pandemic, we decided now was the time to get SameSite as right as possible. Our current PHP version is 7.3 and is relevant to our solution as discussed. Getting it right was not easy as there are suggestions which did not work for us. On reading Secure better your website with SameSite cookies we used the header function to set the cookie where formerly we had used the setcookie function. So to create our cookie we added the following to theme functions.php: /* * Contrast cookie */ function set_contrast_cookie() { // Check if cookie is already set if(!isset($_COOKIE['contrast_state'])) { // Set the cookie, expires in 1 day $expire = date('D, d M Y H:i:s', time() + 60*60*24); // one day from now header("Set-cookie: contrast_state=init; expires=$expire; path=/; SameSite=Lax"); } } add_action('init', 'set_contrast_cookie');
Once the cookie has been created, all our other cookie handling can be done by the browser with JavaScript.
Update 4 May 2021. Previously, we did not need to load js-cookie as that was being loaded by WooCommerce. but then we hit a snag when we implemented Perfmatters for performance reasons. With version 1.6.9 of Perfmatters there were ‘Multiple improvements to WooCommerce disable scripts …’, so js-cookie was no longer being loaded on most of our pages. Thus we needed to load it when necessary.
The fact that js-cookie wasn’t being loaded showed up on the console as ‘Cookie’ being undefined. So our approach was to trap this condition with try and catch statements. But now, how does one dynamically load the required script? We came to Dynamically load JS inside JS [duplicate] and way down with only 8 up votes read about extending jquery.getScript to have the loaded script cached. What a nice idea, so we went for that.
To remove the background image if the cookie value is ‘high’, we need to act as if the ‘contrast’ button had been clicked. So we added the following to custom.js: var contrast; // Page load set contrast high if necessary contrast = Cookies.get("contrast_state"); if (contrast == 'high') { $('body').toggleClass('custom-background custom-contrast'); }
Now we needed to set the cookie when the ‘contrast’ button is clicked, so we added to custom.js in the function for the contrast button .on(‘click’: contrast = Cookies.get("contrast_state"); Cookies.set('contrast_state', (contrast == 'low') ? 'high' : 'low', {expires: 1, path: '/', sameSite: 'lax'});
We decided that we only wanted the tooltip to show without focus being on the ‘contrast’ button on the occasion when the cookie was created. We thought that for it to appear on every page load might be irritating. So we modified the show_tip(); statement to be: contrast = Cookies.get("contrast_state"); if (contrast == 'init') { show_tip(); Cookies.set('contrast_state', 'low', {expires: 1, path: '/', sameSite: 'lax'}); }
As mentioned above, we wanted the tooltip to show for longer on the initial page load when the cookie is created. It’s now the case that the page load show_tip() is only done when the cookie value is ‘init’, that is only once before the cookie expires. So we made some changes to the custom.js code. In place of : var show_tip = function() { target = $((this != null && this === this.window)? vis : this); we now have: var show_for; var is_window; var show_tip = function() { is_window = (this != null && this === this.window); show_for = is_window ? 6000 : 3000; target = $(is_window ? vis : this);
And that’s all that’s needed for the cookie to know the contrast state.
This Publisher’s Grammar Notes and References for Punctuation and Capitalization
Grammar: Punctuation and Capitalization
In text editing for grammar we aim to be both consistent and only to change the author’s text where it seems necessary to avoid a glaring error. In consequence, we keep as close as possible to the author’s work. The Cheeky Possum text rhymes, so we have looked for grammar practices acceptable in poetry, which offer greater latitude than prose.
We hope these notes are useful to encourage the exploration of writing style and rules. Text editing … ugh!
Run-on Sentences, Comma Faults, …
Arguments can be mounted that the opening sentence of The Cheeky Possum should be multiple sentences, but we find it a great introduction to Peter and only when he’s given us his substance, do we stop and digest it. Before coming to this conclusion, a number of articles published on the web were considered:
Should there always be a comma before quotes? Not necessarily according to the Sesquiotica blog. Apart from stand-alone, speech quoted sentences in The Cheeky Possum, all other speech can be viewed as anecdotal, broad-view description.
Capital Letter for a Quote in a Sentence?
The Grammar Monster says, “There is a lot of leniency on the use of capital letters for quotations embedded in sentences. So we’ve allowed: He said ”hey now, this is proof, there’s hippos landing on my head!”. The rendering on the page gives the utterance a dreamy quality as of someone suddenly awoken.
Said but not Spoken, No Quotation Marks?
There is an example of something described as, said, that is without quotation marks, that we have allowed. Its usage is immediate and climatic, and is the thought that Bridgette has, namely: look up there; it’s a possum on a wire. This we take not to be an utterance, but her reaction to the situation. To support this contention, we note that quoted dialogue follows this reaction.
We’re nearing the end of The Cheeky Possum and it’s time to reflect on what we’ve seen and heard. Of course, within the story, the characters too are reflecting and drawing their own conclusions. Here we’re touching on an aspect of the magic of reading to your children. We are nurturing their intellectual development in many ways.
So we have the story, the reader and the listeners. With a picture book the listeners may also be looking and thinking about the illustrations. One looker and thinker, Aria says, of the illustration of Bridgette tucked up inside her bed, “She’s a very tidy teenager!”.