Prevent Multiple Contact Form 7 Submissions without JavaScript

If you want to stop users from clicking the submit button on Contact Form 7 forms multiple times, eg. to prevent multiple submissions, add this CSS snippet to your stylesheet:

.wpcf7-form.submitting .wpcf7-submit {
    pointer-events: none;


  • CF7 will add the submitting class, once the submit button has been clicked. The class will persist until all fields have been validated and/or the form has been sent successfully.
  • The pointer-events property with a value of none will make the submit button not clickable.

WordCamp Switzerland 2023

It’s been quite a while since I published one of my WordCamp photo recap posts! I had to look it up: It was for WCEU 2018. Crazy, how time flies!

I had a great time meeting old friends and making new ones.

Well, without further ado, here’s my (short) photographic recap of WordCamp Switzerland 2023.


1. A Wapuu banner welcomes attendees to WordCamp Switzerland 2023, which took place in Murten/Morat on April 1st 2023.
2. Empty chairs in the “Aquarium” room waiting to be filled.
3. WordCamp Organizer Michael Hörnlimann stands atop the stairs in Centre Loewenberg, waiting for attendees to arrive.
4. Léa McAleese is the first speaker of the day, with her session about “Nurturing your customers”.
5. The microphone, housed inside a foam box, is passed arround between attendees to ask questions.
6. Looking into the “Aula” room during an ongoing session.
7. The hotel buildings are part of Centre Loewenberg, the location for WordCamp Switzerland 2023.
8. Volunteer Florian Blaser waits for the next talk to start in the “Aula” room.
9. Nestor Angulo de Ugarte during his session “Round 1! FIGHT! – Or how to survive against a malicious hacker”.
10. Nico Martin answers questions from the audience after his talk about “How to automate your maintenance with Playwright”.
11. An attendee scans a QR code during Nico Martin’s talk at WordCamp Switzerland 2023.
12. Claudio Rimann, part of the photography team at WordCamp Switzerland 2023, peaks through the door into the “Aula” room.
13. Christian Zumbrunnen announces the next speaker, Remkus De Vries with his session: “WooCommerce, but faster”.
14. Attendees gather for the group photo at WordCamp Switzerland 2023.
15. Stefan “Velthy” Velthuys reacts while picking the winners of Required’s “guess the number of lines of code” competition.
16. Karin Christen hands out the prices to the competition winners.
17. cyon’s Philipp Zeder reacts after winning the competition.
18. Remkus De Vries is getting a back rub from WordCamp Switzerland 2023 organizer Mark Howells-Mead.
19. Noel Tock is getting mic’ed up by Maxime Culea.
20. Milan Ivanovic announces the final session of the day at WordCamp Switzerland 2023.
21. Panel discussion with the topic “WordPress in 2025” is about to start. Moderated by Noel Tock, with participants Matt Cromwell, Karin Christen, Simea Merki and Roslyn Lavery (not pictured).
22. Michael Hörnlimann presents some stats about WordCamp Switzerland 2023 during the closing remarks.
23. Michelle Bulloch says “Au revoir” and good-bye to the attendees at WordCamp Switzerland 2023.

Interested in going down memory lane? Have a look at all posts tagged WordCamp, with all of the recaps going back to the very first WordCamp Europe.

All images in this post taken by Florian Ziegler and are licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

And finally, for those who are interested: All photos taken with the Leica M10-P with either the 35mm or 50mm lens. Editing and gentle post processing in Lightroom.

WordCamp in Athens

I bought a ticket for WordCamp Europe 2023 in Athens! After missing last year’s #wceu, I am looking forward to exploring a city I have never been to and meeting many of the people I haven’t seen since 2019!

Exclude Status Posts From RSS Feed in WordPress

I added a notes feature to my blog using WordPress’ status post format.

At some point I might create a separate RSS feed for those posts, but for now I wanted to exclude them from the general RSS feed, to keep it somewhat clean, containing only proper blog posts.

This is how I implemented it:

function my_theme_exclude_status_posts_from_feed( $wp_query ) {
	if ( $wp_query->is_feed ) {
		$status_posts = get_posts( [
			'posts_per_page' => -1,
			'tax_query' => [
					'taxonomy' => 'post_format',
					'terms' => [ 'post-format-status' ],
					'field' => 'slug',
					'operator' => 'IN',
			'fields' => 'ids'
		] );

		$wp_query->set( 'post__not_in', $status_posts );

	return $wp_query;

add_filter( 'pre_get_posts', 'my_theme_exclude_status_posts_from_feed' );

Please let me know, if you know of a better/cleaner way to achieve this.

Update: After some input from Mark, I rewrote it, with one query less:

function my_theme_exclude_status_posts_from_feed( $wp_query ) {
	if ( $wp_query->is_feed ) {

		$filter = [
			'taxonomy' => 'post_format',
			'terms' => [ 'post-format-status' ],
			'field' => 'slug',
			'operator' => 'NOT IN',

		$tax_query = $wp_query->get( 'tax_query' );

		if ( is_array( $tax_query ) ) {
			$tax_query[] = $filter;
		else {
			$tax_query = [ $filter ];
		$wp_query->set( 'tax_query', $tax_query );

	return $wp_query;

add_filter( 'pre_get_posts', 'my_theme_exclude_status_posts_from_feed' );

Automatically Share WordPress Posts on Mastodon

Since Mastodon is really taking off (this time around), I was thinking about how to use it and integrate it into my general publishing workflow. (Not that I am posting much, but still.)

I have always been a fan of posting to my blog first, then to social media second.

A couple of days ago I activated post formats, more precisely the “status” format, to publish short notes, which do not warrant a proper blog post.

I also wanted to share those notes on Mastodon automatically. When looking into how to achieve that, I found the Share on Mastodon plugin. It is pretty straight forward to configure and it just works.

Jan, the developer, has added some well placed filters, which you can use to define exactly what is being shared. Have a look at the documentation with some examples on Jan’s website.

I made some adjustments using the share_on_mastodon_status filter, so that the post on Mastodon contains different things depending on the post format:

add_filter( 'share_on_mastodon_status', function( $status, $post ) {

    // Share only the post content if it is a status post
    if ( has_post_format( 'status', $post ) ) {
        $status = wp_strip_all_tags( $post->post_content );
    // Share title + tags + url, if it is a regular post
    else {
        $status = wp_strip_all_tags( get_the_title( $post->ID ) );
        $tags = get_the_tags( $post->ID );
        if ( $tags ) {
            $temp = '';
            foreach ( $tags as $tag ) {
                $temp .= '#' . preg_replace( '/\s/', '', $tag->name ) . ' ';
            $status .= "\n\n" . trim( $temp );
        $status .= . "\n\n🔗 " . get_the_permalink( $post->ID );

    return $status;

}, 10, 2 );

Let’s connect on Mastodon!

Create a Custom Settings Page in WordPress

I have created a lot of custom settings pages in WordPress over the years. Still, this morning, I struggled, because my options just wouldn’t save. So I decided to write down all the parts as a very basic reference for my future self.

Read more

picu Update

We just released picu 1.6.0, which adds support for multi-client collections. This was by far the most involved project inside of picu to date, as it required us to touch almost all parts of the plugin.

Read more

I replaced WordPress with Kirby

For a couple of months now my photo blog has been running on Kirby. In the following post I will share some observations I made during the implementation of my first real life project using Kirby, in which I re-built my photo blog, which was previously running on a completely custom built WordPress theme.

Read more

This is my photographic recap of WordCamp Europe #6, which took place in Belgrade, Serbia last week.

Read more

The fifth WordCamp Europe took place in Paris last week. I am repeating myself each year, when I say how great it was!

I had the role of photography team lead this year, which meant that I somehow ended up shooting fewer images than in the years before. Nevertheless – here are my favorite photos (that I took) from WordCamp Europe 2017.

Read more