<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WP Engineer</title>
	<atom:link href="https://wpengineer.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://wpengineer.com</link>
	<description>WordPress News, Hacks, Tips, Tutorials, Plugins and Themes</description>
	<lastBuildDate>Wed, 07 May 2025 07:51:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>

<image>
	<url>https://wpengineer.com/wp-content/uploads/cropped-photo-32x32.png</url>
	<title>WP Engineer</title>
	<link>https://wpengineer.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Customizing the User Registration Notification eMails</title>
		<link>https://wpengineer.com/2822/customizing-the-user-registration-notification-emails/</link>
					<comments>https://wpengineer.com/2822/customizing-the-user-registration-notification-emails/#comments</comments>
		
		<dc:creator><![CDATA[Latz]]></dc:creator>
		<pubDate>Tue, 16 Jan 2018 10:07:25 +0000</pubDate>
				<category><![CDATA[WordPress Tutorials]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2822</guid>

					<description><![CDATA[If a new user registers at a WordPress site, the new user and the administrator receive notification emails: User: From: myBlog (info@myBlog.com)Subject: [myBlog] Your username and password info Username: new_user To set your password, visit the following address:&#60;http://myblog/wp-login.php?action=rp&#38;key=3oCJkevP1ZSSb0P8DlOW&#38;login=new_user&#62; http://myblog/wp-login.php Admin: From: myBlog (info@myBlog.com)Subject: [myBlog] New User Registration New user registration on your site myBlog: Username: [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>If a new user registers at a WordPress site, the new user and the administrator receive notification emails:</p>



<span id="more-2822"></span>



<p>User:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>From</em>: myBlog (<code>info@myBlog.com</code>)<br><em>Subject</em>: [myBlog] Your username and password info</p>



<p>Username: <code>new_user</code></p>



<p>To set your password, visit the following address:<code>&lt;http://myblog/wp-login.php?action=rp&amp;key=3oCJkevP1ZSSb0P8DlOW&amp;login=new_user&gt;</code></p>



<p><code>http://myblog/wp-login.php</code></p>
</blockquote>



<p>Admin:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>From</em>: myBlog (<code>info@myBlog.com</code>)<br><em>Subject</em>: [myBlog] New User Registration</p>



<p>New user registration on your site myBlog:</p>



<p>Username: <code>new_user</code></p>



<p>Email: <code>new_user@myblog.com</code></p>
</blockquote>



<p>Until version 4.8 the content of the mail was hard coded. The only way to alter the emails was to hook into <a href="https://developer.wordpress.org/reference/functions/wp_mail/">wp_mail()</a> or even <a href="https://codex.wordpress.org/Plugin_API/Action_Reference/phpmailer_init">phpmailer</a>.</p>



<p>WordPress v4.9 now offers the ability to easily customize these emails by using the following filters:</p>



<ul class="wp-block-list">
<li><a href="https://developer.wordpress.org/reference/functions/wp_new_user_notification/">wp_new_user_notification_email</a></li>



<li><a href="https://developer.wordpress.org/reference/hooks/wp_new_user_notification_email_admin/">wp_new_user_notification_email_admin</a></li>
</ul>



<p>The filters fire after the user has been added to the database.</p>



<p>The filters for the user’s and the admin&#8217;s email follow the same logic, just the filter and the variable names differ:</p>



<pre class="wp-block-preformatted">$wp_new_user_notification_email_admin = apply_filters( 'wp_new_user_notification_email_admin', $wp_new_user_notification_email_admin, $user, $blogname )</pre>



<p>The parameters contain the following values:</p>



<ul class="wp-block-list">
<li><code>$wp_new_user_notification_email_admin</code>: Associative array with the keys to, subject, message, headers.</li>



<li><code>$user</code>: A WP_User object of the registered user.</li>



<li><code>$blogname</code>: A string containing the name of the blog the user registered to.</li>
</ul>



<p>With these values at hand it’s easy to create your customized mail:</p>



<pre class="wp-block-code"><code>add_action( 'login_init', 'my_wp_new_user_notification_email_admin_init' );

function my_wp_new_user_notification_email_admin_init() {
    add_filter( 'wp_new_user_notification_email_admin', 'my_wp_new_user_notification_email_admin', 10, 3 );
}

function my_wp_new_user_notification_email_admin( $wp_new_user_notification_email, $user, $blogname ) {
    $wp_new_user_notification_email&#91;'subject'] = sprintf( '&#91;%s] New user %s registered.', $blogname, $user-&gt;user_login );
    $wp_new_user_notification_email&#91;'message'] = sprintf( "%s ( %s ) has registerd to your blog %s.", $user-&gt;user_login, $user-&gt;user_email, $blogname );

    return $wp_new_user_notification_email;

}</code></pre>



<pre class="wp-block-preformatted">(As always for filters: do not forget to return the altered variable.)&nbsp; The mail now looks like this:</pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>From:</em> myBlog (<code>MyBlog@myblog.com</code>)<br><em>Subject:</em> [myBlog] New user new_user registered.</p>



<p>new_user (<code>new_user@user.com</code>) has registerd to your blog myBlog.</p>
</blockquote>



<p>Of course, you can insert more data than is provided by the filter. E.g., you can tell the admin, how many registered users the blog already has:</p>



<pre class="wp-block-code"><code>function my_wp_new_user_notification_email_admin($wp_new_user_notification_email, $user, $blogname) {

    $user_count = count_users();

    $wp_new_user_notification_email&#91;'subject'] = sprintf('&#91;%s] New user %s registered.',
$blogname, $user-&gt;user_login);
    $wp_new_user_notification_email&#91;'message'] =
    sprintf( "%s has registerd to your blog %s.", $user-&gt;user_login, $blogname) .
"\n\n\r" . sprintf("This is your %d. user!", $user_count&#91;'total_users']);

    return $wp_new_user_notification_email;

}</code></pre>



<pre class="wp-block-preformatted">The parameter <em>headers</em> can be used to change some header information easily:

In this example, the <em>From</em> information of the mail is changed and the user <em>admin2@myblog</em> is added as an additional recipient. As you can see, multiple headers entries are separated by "\n\r" (return and linefeed).</pre>



<pre class="wp-block-code"><code>$wp_new_user_notification_email&#91;'headers'] = "From: myBlog &lt;myblog@myblog.com&gt; \n\r cc: Admin 2 &lt;admin2@mblog.com&gt;";</code></pre>



<p>As said before, this all could already be done by using wp_mail() and phpmailer but the new filters are way more convenient.</p>



<p><strong>Note</strong>. The strings are \n and \r in the code means.</p>



<ul class="wp-block-list">
<li><code>\r</code>&nbsp;is the&nbsp;<strong>carriage return</strong></li>



<li><code>\</code>n&nbsp;is the&nbsp;<strong>new line</strong></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2822/customizing-the-user-registration-notification-emails/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Download older plugin versions from wordpress.org</title>
		<link>https://wpengineer.com/2813/download-older-plugin-versions-from-wordpress-org/</link>
					<comments>https://wpengineer.com/2813/download-older-plugin-versions-from-wordpress-org/#comments</comments>
		
		<dc:creator><![CDATA[Latz]]></dc:creator>
		<pubDate>Thu, 14 Sep 2017 11:56:00 +0000</pubDate>
				<category><![CDATA[WordPress Plugins]]></category>
		<category><![CDATA[plugins]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2813</guid>

					<description><![CDATA[There&#8217;s a simple way to get hold of previous versions of your WordPress plugins, for example if a current version breaks your setup. On the right side of the plugin&#8217;s page there a link called &#8220;Advanced View&#8221;, which should better be called &#8220;Version View&#8221;: Very, very (very) far at the end of the page there [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>There&#8217;s a simple way to get hold of previous versions of your WordPress plugins, for example if a current version breaks your setup.<span id="more-2813"></span></p>
<p>On the right side of the plugin&#8217;s page there a link called &#8220;Advanced View&#8221;, which should better be called &#8220;Version View&#8221;:</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-large wp-image-2814" src="https://wpengineer.com/wp-content/uploads/frueher_version_2_1-1024x653.png" alt="" width="745" height="475" srcset="https://wpengineer.com/wp-content/uploads/frueher_version_2_1-1024x653.png 1024w, https://wpengineer.com/wp-content/uploads/frueher_version_2_1-300x191.png 300w, https://wpengineer.com/wp-content/uploads/frueher_version_2_1-768x490.png 768w, https://wpengineer.com/wp-content/uploads/frueher_version_2_1-745x475.png 745w, https://wpengineer.com/wp-content/uploads/frueher_version_2_1.png 1046w" sizes="(max-width: 745px) 100vw, 745px" /></p>
<p>Very, very (very) far at the end of the page there a dropdown box where you can select the desired version and click &#8220;Download&#8221; the get the desired version:<img decoding="async" class="aligncenter size-full wp-image-2815" src="https://wpengineer.com/wp-content/uploads/fruehere_version_2_2.png" alt="" width="660" height="758" srcset="https://wpengineer.com/wp-content/uploads/fruehere_version_2_2.png 660w, https://wpengineer.com/wp-content/uploads/fruehere_version_2_2-261x300.png 261w" sizes="(max-width: 660px) 100vw, 660px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2813/download-older-plugin-versions-from-wordpress-org/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Create your own bulk actions</title>
		<link>https://wpengineer.com/2803/create-your-own-bulk-actions/</link>
		
		<dc:creator><![CDATA[Latz]]></dc:creator>
		<pubDate>Tue, 25 Oct 2016 09:00:45 +0000</pubDate>
				<category><![CDATA[WordPress Tutorials]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[Tutorials]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2803</guid>

					<description><![CDATA[Including version 4.6 it was quite difficult to add custom bulk actions to the WordPress admin pages. In version 4.7 a hook is added that simplifies the task a lot: add_action('bulk_actions-{screen_id}', 'my_bulk_action'); Defining the hook As an example we&#8217;ll use the post page, the variables are named accordingly. add_filter( 'bulk_actions-edit-post', 'register_my_bulk_actions' ); Definig the hook [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter"><img decoding="async" width="618" height="178" src="https://wpengineer.com/wp-content/uploads/2016-10-21_13-46-04.png" alt="2016-10-21_13-46-04" class="wp-image-2804" srcset="https://wpengineer.com/wp-content/uploads/2016-10-21_13-46-04.png 618w, https://wpengineer.com/wp-content/uploads/2016-10-21_13-46-04-300x86.png 300w" sizes="(max-width: 618px) 100vw, 618px" /></figure>



<p><br>Including version 4.6 it was quite difficult to add custom bulk actions to the WordPress admin pages. In version 4.7 a hook is added that simplifies the task a lot:</p>



<span id="more-2803"></span>



<pre class="wp-block-preformatted"><code>add_action('bulk_actions-{screen_id}', 'my_bulk_action');</code></pre>



<h3 class="wp-block-heading">Defining the hook</h3>



<p>As an example we&#8217;ll use the post page, the variables are named accordingly.</p>



<pre class="wp-block-preformatted">add_filter( 'bulk_actions-edit-post', 'register_my_bulk_actions' );</pre>



<h3 class="wp-block-heading">Definig the hook</h3>



<pre class="wp-block-preformatted">function register_my_bulk_actions($bulk_actions) {
  $bulk_actions['my_bulk_action'] = __( 'My Bulk Action', 'domain');
  $bulk_actions['my_other_bulk_action'] = __( 'My Other Bulk Action', 'domain');
  return $bulk_actions;
}
</pre>



<p>You can define more than one bulk action in this function because it merely adds an additional element to the array <code>$bulk_actions</code>. You simply have to take care that you use different names for the element keys and, logically, for the display texts.</p>



<h3 class="wp-block-heading">The screen ids</h3>



<p>The screen id of an admin page can be displayed this code snippet:</p>



<pre class="wp-block-preformatted">$screen = get_current_screen();
var_dump($screen);
</pre>



<p>This table shows the ids for some admin pages:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Page</th><th>$screen_id</th><th>File</th></tr></thead><tbody><tr><td>Media Library</td><td>upload</td><td>upload.php</td></tr><tr><td>Comments</td><td>edit-comments</td><td>edit-comments.php</td></tr><tr><td>Tags</td><td>edit-post_tag</td><td>edit-tags.php</td></tr><tr><td>Plugins</td><td>plugins</td><td>plugins.php</td></tr><tr><td>Links</td><td>link-manager</td><td>link-manager.php</td></tr><tr><td>Users</td><td>users</td><td>users.php</td></tr><tr><td>Posts</td><td>edit-post</td><td>edit.php</td></tr><tr><td>Pages</td><td>edit-page</td><td>edit.php</td></tr><tr><td>Edit Site: Themes</td><td>site-themes-network</td><td>network/site-themes.php</td></tr><tr><td>Themes</td><td>themes-network</td><td>network/themes</td></tr><tr><td>Users</td><td>users-network</td><td>network/users</td></tr><tr><td>Edit Site: Users</td><td>site-users-network</td><td>network/site-users</td></tr><tr><td>Sites</td><td>sites-network</td><td>network/sites</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Defining the callback function</h3>



<p>Here&#8217;s an overview of the whole function:</p>



<pre class="wp-block-preformatted">add_filter( 'handle_bulk_actions-edit-post', 'my_bulk_action_handler', 10, 3 );

function my_bulk_action_handler( $redirect_to, $action_name, $post_ids ) { 
  if ( 'my_bulk_action' === $action_name ) { 
    foreach ( $post_ids as $post_id ) { 
      $post = get_post($post_id); 
      // process $post wp_update_post($post); 
    } 
    $redirect_to = add_query_arg( 'bulk_posts_processed', count( $post_ids ), $redirect_to ); 
    return $redirect_to; 
  } 

  elseif ( 'my_other_bulk_action' === $action_name ) { 
    foreach ( $post_ids as $post_id ) { 
      $post_meta = get_post_meta( $post_id ); 
      // process $post_meta update_post_meta( $post_meta ); 
    } 
    $redirect_to = add_query_arg( 'other_bulk_posts_precessed', count( $post_ids ), $redirect_to );
    return $redirect_to; 
  } 
  
  else 
    return $redirect_to; } 
</pre>



<p>As mentioned above you can define more than one custom bulk action but only a single callback function. So you first have to test which bulk action has been selected (lines 4 and 13).</p>



<p>Next the posts are processed in a <code>foreach</code> loop (lines 5 and 14). In this loop you can load the post with <code>get_post</code> or the post meta with <code>get_post_meta()</code> and process the data. Next the changed data is written back to the database with <code>wp_update_post()</code> or <code>update_post_meta()</code>.</p>



<p>The variable <code>$redirect_to</code> (lines 9 and 18) is used to define the URL the browser will change to after the bulk actions have been completed, in our case it is set to <code>.../wp-admin/edit.php?paged=1</code>. We do not want to change the location but to use the variable to pass a value to the page the browser is redirected to.<br>
With the function <code>add_query_arg()</code> we add an argument to the URL that specifies the number of processed posts: <code>/wp-admin/edit.php?paged=1&amp;bulk_posts_processed=1</code>.</p>



<h3 class="wp-block-heading">Display a success notification</h3>



<p>After completing processing all posts you can display an admin notice using the action <code>admin_notices()</code>. The second parameter of the function call needs to contain the text string we have defined in our filter <code>bulk_actions-{screen-id}</code>:</p>



<pre class="wp-block-preformatted">function my_bulk_action_admin_notice() { 
  if ( ! empty( $_REQUEST['bulk_posts_processed'] ) ) { 
    $posts_count = intval( $_REQUEST['bulk_posts_processed'] ); printf( '
' . _n( 'Processed %s post.', 'Processed %s posts.', $posts_count, 'domain' ) . ' ', $posts_count ); 
  } 
} 
</pre>



<h3 class="wp-block-heading">Trivia</h3>



<p>A little fun fact at the end: The corresponding ticket (<a href="https://core.trac.wordpress.org/ticket/16031" target="_blank">#16031</a>) was opened six years ago, 2010, in that times we used WordPress v3.0.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Download older plugin versions from wordpress.org</title>
		<link>https://wpengineer.com/2747/download-older-plugin-versions-from-wordpress-org-old/</link>
					<comments>https://wpengineer.com/2747/download-older-plugin-versions-from-wordpress-org-old/#comments</comments>
		
		<dc:creator><![CDATA[Latz]]></dc:creator>
		<pubDate>Mon, 16 Mar 2015 10:00:05 +0000</pubDate>
				<category><![CDATA[WPengineer Misc]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2747</guid>

					<description><![CDATA[So you&#8217;ve updated your plugins&#8230; &#8230; and your blog doesn&#8217;t work anymore &#8230; and you have no backup &#8230; &#8230; of course not! Wouldn&#8217;t it be nice if you could download the previous versions and get your blog back on track again? Well&#8230; you can! Tell your browser to go to wordpress.org/plugins/&#60;your_plugin&#62; and navigate to [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>So you&#8217;ve updated your plugins&#8230;</p>
<p>&#8230; and your blog doesn&#8217;t work anymore</p>
<p>&#8230; and you have no backup</p>
<p>&#8230;</p>
<p>&#8230; of course not!</p>
<p>Wouldn&#8217;t it be nice if you could download the previous versions and get your blog back on track again? Well&#8230; you can!</p>
<p><span id="more-2747"></span></p>
<p>Tell your browser to go to <a class="linkificator-ext" title="Linkificator: http://wordpress.org/plugins/&amp;lt;your_plugin&amp;gt" href="http://wordpress.org/plugins/&amp;lt;your_plugin&amp;gt">wordpress.org/plugins/&lt;your_plugin&gt;</a> and navigate to the rightmost tab called &#8220;Developers&#8221; (1):<br />
<img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2748" src="https://wpengineer.com/wp-content/uploads/old_versions.png" alt="old_versions" width="797" height="810" srcset="https://wpengineer.com/wp-content/uploads/old_versions.png 797w, https://wpengineer.com/wp-content/uploads/old_versions-295x300.png 295w, https://wpengineer.com/wp-content/uploads/old_versions-745x757.png 745w" sizes="auto, (max-width: 797px) 100vw, 797px" /><br />
Here you can download every version of the plugin ever published to wordpress.org. Click on the version number to download the plugin as a ZIP file (2), use FTP to copy it to your server, and be happy again. Until next time.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2747/download-older-plugin-versions-from-wordpress-org-old/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Test or Meet at WordCamp San Francisco and Win a Plugin License!</title>
		<link>https://wpengineer.com/2715/test-or-meet-at-wordcamp-san-francisco-and-win-a-plugin-license/</link>
					<comments>https://wpengineer.com/2715/test-or-meet-at-wordcamp-san-francisco-and-win-a-plugin-license/#comments</comments>
		
		<dc:creator><![CDATA[Alex]]></dc:creator>
		<pubDate>Mon, 20 Oct 2014 06:12:30 +0000</pubDate>
				<category><![CDATA[WPengineer Misc]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2715</guid>

					<description><![CDATA[Next week I will be at WordCamp San Francisco and a week later at the WooConf! Maybe one or antoher of our loyal readers will also be there. It would be great to meet you in person! Frank and I had such a blast at WordCamp Europe in Sofia last month. It was great to [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" src="https://wpengineer.com/wp-content/uploads/WordCamp-San-Francisco1.jpg" width="637" height="478" alt="WordCamp San Francisco" /></p>
<p>Next week I will be at <a href="http://2014.sf.wordcamp.org/" target="_blank">WordCamp San Francisco</a> and a week later at the <a href="http://conf.woocommerce.com/" target="_blank">WooConf</a>! Maybe one or antoher of our loyal readers will also be there. It would be great to meet you in person!</p>
<p>Frank and I had such a blast at <a href="http://2014.europe.wordcamp.org/" target="_blank">WordCamp Europe in Sofia</a> last month. It was great to meet many of our old WordPress buddies and get to know even more WodPress freaks there.</p>
<p>We also had the chance to show many people the newest version of our <a href="http://multilingualpress.org/" target="_blank">Multlingual WordPress plugin MultlingualPress</a>. Everybody was very excited about it. Because it is a clean solution without any performance issues. It is very userfriendly, build on existing core functionality, no compromises in SEO, etc. &#8230;  <a href="http://multilingualpress.org/" target="_blank">see all features here</a>. </p>
<p>Many people we talked to, had the problem, that they are tight to their current multilanguage solution. If they deactivate their plugin, the content is gone. Big issue if you want to move to a better performing solution. Very soon, it won&#8217;t be anymore, <a href="https://plus.google.com/+Inpsyde/posts/MNbd6ekWqV6" target="_blank">espacially with your help testing it</a>. We are currently building a WPML importer to easily switch to MultlingualPress. <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Other importer will follow soon too.</p>
<h2>There are two ways to win a pro plugin of MultilingualPress</h2>
<p>We are looking for some engaging tester for our new WPML importer. If you participate, you can get our pro version for free. If you are interested please contact Frank directly at frank@bueltge.de, for more information <a href="https://plus.google.com/+Inpsyde/posts/MNbd6ekWqV6" target="_blank">read our post on Google+</a>. We really appreciate your support!</p>
<p>On <a href="http://wespeakwp.com/" target="_blank">#WeSpeakWP</a> we will have a little contest going for WordCamp San Francisco. Get a sticker in your language from me, if available, at WordCamp San Franciso or WooConf and post a photo/selfie with the sticker on Twitter. Not to forget with hashtag #WeSpeakWP ! The more fun and crazy the photos are, even better! <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><img loading="lazy" decoding="async" src="https://wpengineer.com/wp-content/uploads/we-speak-wordpress1.jpg" width="637" height="344" alt="WordCamp San Francisco" /><br />
<img loading="lazy" decoding="async" src="https://wpengineer.com/wp-content/uploads/Aufkleber.jpg" width="637" height="425" alt="WordCamp San Francisco" /></p>
<p>Of course there is also a <a href="https://wordpress.org/plugins/multilingual-press/" target="_blank">free version available</a>, so try it out. <a href="http://multilingualpress.org/" target="_blank">Here you can see</a> the differences between the pro and free version. Not to forget, with the pro version you get an excellent support!</p>
<p>I&#8217;m really looking forward to meet you in San Francisco! Let me in our comments know if you will be there! Can&#8217;t wait!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2715/test-or-meet-at-wordcamp-san-francisco-and-win-a-plugin-license/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title>Inform user about automatic comment closing time</title>
		<link>https://wpengineer.com/2692/inform-user-about-automatic-comment-closing-time/</link>
					<comments>https://wpengineer.com/2692/inform-user-about-automatic-comment-closing-time/#comments</comments>
		
		<dc:creator><![CDATA[Latz]]></dc:creator>
		<pubDate>Thu, 26 Jun 2014 09:00:27 +0000</pubDate>
				<category><![CDATA[WordPress Hacks]]></category>
		<category><![CDATA[comments]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2692</guid>

					<description><![CDATA[To prevent spammers from flooding old articles with useless comments, you can set WordPress to close comments after a certain number of days: It might be surprising for some users if the comments are closed automatically, so it might be a good idea to inform them about the remaining time. add_action( 'comment_form_top', 'topic_closes_in' ); function [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image aligncenter"><img loading="lazy" decoding="async" width="568" height="87" src="https://wpengineer.com/wp-content/uploads/close-comments.png" alt="close-comments" class="wp-image-2699" srcset="https://wpengineer.com/wp-content/uploads/close-comments.png 568w, https://wpengineer.com/wp-content/uploads/close-comments-300x45.png 300w" sizes="auto, (max-width: 568px) 100vw, 568px" /></figure>



<p>To prevent spammers from flooding old articles with useless comments, you can set WordPress to close comments after a certain number of days:<br> <br> It might be surprising for some users if the comments are closed automatically, so it might be a good idea to inform them about the remaining time.</p>



<span id="more-2692"></span>



<pre class="wp-block-preformatted">add_action( 'comment_form_top', 'topic_closes_in' );

function topic_closes_in() {
    global $post;
    if ($post-&gt;comment_status == 'open') {
        $close_comments_days_old = get_option( 'close_comments_days_old' );
        $expires = strtotime( "{$post-&gt;post_date_gmt} GMT" ) +  $close_comments_days_old * DAY_IN_SECONDS;
        printf( __( '(This topic will automatically close in %s. )', 'domain' ),  human_time_diff( $expires ));
    }
}
</pre>



<p>While the code should be almost self explanatory there is an interesting function not every WordPress developer might know: <code>human_time_diff()</code>. This function is hidden in the <code>.../wp-includes/formatting.php</code> file. It is originally planned to be used in themes to provide a more &#8220;human&#8221; touch to the date/time a post was written. Since the function does not care if the date is in the past or in the future we can use it for our needs.</p>



<figure class="wp-block-image aligncenter"><img loading="lazy" decoding="async" width="722" height="178" src="https://wpengineer.com/wp-content/uploads/close-comment-example.png" alt="close comment example" class="wp-image-2698" srcset="https://wpengineer.com/wp-content/uploads/close-comment-example.png 722w, https://wpengineer.com/wp-content/uploads/close-comment-example-300x73.png 300w" sizes="auto, (max-width: 722px) 100vw, 722px" /></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2692/inform-user-about-automatic-comment-closing-time/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
		<item>
		<title>Escaping the maintenance mode trap</title>
		<link>https://wpengineer.com/2659/escaping-the-maintenance-mode-trap/</link>
					<comments>https://wpengineer.com/2659/escaping-the-maintenance-mode-trap/#comments</comments>
		
		<dc:creator><![CDATA[Latz]]></dc:creator>
		<pubDate>Mon, 06 Jan 2014 10:00:13 +0000</pubDate>
				<category><![CDATA[WordPress Tutorials]]></category>
		<category><![CDATA[Maintenance Mode]]></category>
		<category><![CDATA[upgrade]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2659</guid>

					<description><![CDATA[WordPress makes upgrading very easy . You simply click &#8220;Update now&#8221;, wait for a minute or two and your system is up to date. If, well if everything works fine. The most common problem during an upgrade is the Internet connection to drop unexpectedly or the user to shut down the browser unintentionally. In both [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>WordPress makes upgrading very easy . You simply click &#8220;Update now&#8221;, wait for a minute or two and your system is up to date. If, well if everything works fine.<br />
The most common problem during an upgrade is the Internet connection to drop unexpectedly or the user to shut down the browser unintentionally. In both situations the upgrade will stop instantly.<br />
If you try to log in to your backend again you will receive the message</p>
<p>&#8220;Briefly unavailable for scheduled maintenance. Check back in a minute.&#8221;</p>
<p>This message is useful to keep users away from your blog during the upgrade but right now it&#8217;s keeping you from restarting the upgrade. To solve this problem we have to take a look at how WordPress determines that it&#8217;s in maintenance mode.</p>
<p>WordPress is looking for a possible maintenance mode very early to prevent the system dying from any fatal error. So it using a very simple method by writing a file called <code>.maintenance</code> to the WordPress root directory. If the blog or backend is accessed it will check for the file and stop if it&#8217;s present.</p>
<p>Knowing this the solution to our problem is quite simple: access your WordPress system via FTP and delete the file <code>.maintenance</code>.  </p>
<p>If you&#8217;re not able to log in to your server via FTP for some reason there is a second method for escaping from maintenance mode: simply wait 10 minutes!<br />
The file <code>.maintenance</code> contains a timestamp of the time the file was created. If this time is less than 10 minutes ago WordPress will go into maintenance mode otherwise it will continue to work as usual and enable you to restart the upgrade unless something worse keeps it from starting.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2659/escaping-the-maintenance-mode-trap/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
			</item>
		<item>
		<title>New hooks in WordPress 3.8</title>
		<link>https://wpengineer.com/2656/new-hooks-in-wordpress-3-8/</link>
					<comments>https://wpengineer.com/2656/new-hooks-in-wordpress-3-8/#comments</comments>
		
		<dc:creator><![CDATA[Latz]]></dc:creator>
		<pubDate>Mon, 16 Dec 2013 10:00:53 +0000</pubDate>
				<category><![CDATA[WordPress Plugins]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[hooks]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2656</guid>

					<description><![CDATA[WordPress 3.8 introduced one new action and five new filters: automatic_updates_complete Action triggered after all automatic updates have run. (wp-admin/includes/class-wp-upgrader.php) automatic_updates_debug_email Filter the debug email that can be sent following an automatic background core update. (wp-admin/includes/class-wp-upgrader.php) comment_notification_notify_author Filter whether to notify comment authors of their comments on their own posts. (wp-includes/pluggable.php) dashboard_glance_items Include additional elements [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>WordPress 3.8 introduced one new action and five new filters:</p>
<ul>
<li><strong>automatic_updates_complete</strong><br />
Action triggered after all automatic updates have run.<br />
(wp-admin/includes/class-wp-upgrader.php)<br />
</lí></p>
<li><strong>automatic_updates_debug_email</strong><br />
Filter the debug email that can be sent following an automatic background core update.<br />
(wp-admin/includes/class-wp-upgrader.php)
</li>
<li>
<strong>comment_notification_notify_author</strong><br />
Filter whether to notify comment authors of their comments on their own posts.<br />
(wp-includes/pluggable.php)
</li>
<li>
<strong>dashboard_glance_items</strong><br />
Include additional elements in the &#8216;At a Glance&#8217; dashboard widget. This widget was previously &#8216;Right Now&#8217;.<br />
(wp-admin/includes/dashboard.php)
</li>
<li>
<strong>user_{$name}_label</strong><br />
Filter a user contactmethod label.<br />
(wp-admin/user-edit.php)
</li>
<li>
<strong>wp_prepare_themes_for_js</strong><br />
Filter the themes prepared for JavaScript, for themes.php. Could be useful for changing the order, which is by name by default.<br />
(wp-admin/includes/theme.php)
</li>
<p>A list of all new hooks can you also find in the <a href="http://wpseek.com/hot/">hot list of WP Seek</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2656/new-hooks-in-wordpress-3-8/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Every Day A Post of WordPress Tips and Tricks until Christmas!</title>
		<link>https://wpengineer.com/2652/every-day-a-post-of-wordpress-tipps-and-tricks-until-christmas/</link>
					<comments>https://wpengineer.com/2652/every-day-a-post-of-wordpress-tipps-and-tricks-until-christmas/#comments</comments>
		
		<dc:creator><![CDATA[Alex]]></dc:creator>
		<pubDate>Thu, 28 Nov 2013 14:51:16 +0000</pubDate>
				<category><![CDATA[WPengineer Misc]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2652</guid>

					<description><![CDATA[The time has come and our loyal reader know already our traditional Advents Calendar. For the people who don&#8217;t know, every year we had in December each day, until the 24th (Christmas Eve in Germany), a post with specials, tips, tricks, plugins, tutorials and so on. Since it is quite a lot work to accomplish [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://marketpress.com/2013/the-marketpress-adventskalender-2013-24-days-wordpress-tips-and-tricks-each-day/?noredirect=en"><img loading="lazy" decoding="async" src="https://wpengineer.com/wp-content/uploads/WordPress-Christmas-2013-300x200.jpg" alt="WordPress-Christmas-2013" width="300" height="200" class="alignleft size-medium wp-image-2653" srcset="https://wpengineer.com/wp-content/uploads/WordPress-Christmas-2013-300x200.jpg 300w, https://wpengineer.com/wp-content/uploads/WordPress-Christmas-2013-1024x682.jpg 1024w, https://wpengineer.com/wp-content/uploads/WordPress-Christmas-2013-745x496.jpg 745w, https://wpengineer.com/wp-content/uploads/WordPress-Christmas-2013.jpg 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>The time has come and our loyal reader know already our traditional Advents Calendar. For the people who don&#8217;t know, every year we had in December each day, until the 24th (Christmas Eve in Germany), a post with specials, tips, tricks, plugins, tutorials and so on. </p>
<p>Since it is quite a lot work to accomplish 24 high quality posts, we asked some of the finest WordPress Experts in Germany if they would like to contribute some ideas and great posts to it every day. </p>
<p>We decided to put all the posts on the new <a href="http://marketpress.com/news/" title="WordPress News, Themes and Plugins" target="_blank">marketpress.com blog</a>, where you already can find some really interesting posts like:</p>
<p><a href="http://marketpress.com/2013/back-to-the-future-how-wp_date_query-works/" title="wp_date_query WordPress" target="_blank">Back to the Future &#8211; How wp_date_query Works!</a></p>
<p><a href="http://marketpress.com/2013/maximum-size-for-woocommerce-shops/" title="WooCommerce WordPress Online Shop" target="_blank">Is there a maximum size for WooCommerce shops?</a></p>
<p><a href="http://marketpress.com/2013/extend-wordpress-user-roles-theme-options-for-editors/" title="Extend WordPress User Roles" target="_blank">Extend WordPress User Roles: Theme Options for Editors</a></p>
<p><a href="http://marketpress.com/2013/code-is-poetry/" title="WordPress Code" target="_blank">Code is poetry?</a></p>
<p><a href="http://marketpress.com/2013/ghost-installation-with-windows-what-you-need-to-know/" title="Ghost Windows Installation" target="_blank">Ghost-Installation with Windows – What You Need to Know!</a><br />
<a href="http://marketpress.com/2013/wordpress-backend-design-study" title="WordPress Backend Design Study" target="_blank"><br />
WordPress Backend Design Study</a></p>
<p><a href="http://marketpress.com/2013/wordcamp-europe-an-awesome-event/" title="WordCamp Europe Matt Interview" target="_blank">WordCamp Europe – Video Interviews with Matt, Otto and other Core Contributor</a><br />
<a href="http://marketpress.com/2013/deploying-wordpress-with-git-and-capistrano/" title="WordPress Git and Capistrano" target="_blank"><br />
Deploying WordPress with Git and Capistrano</a></p>
<p><a href="http://marketpress.com/2013/wordpress-becomes-10-lets-celebrate-with-a-free-infographic-and-prizes/" title="WordPress 10 years Infographic" target="_blank">WordPress becomes 10 – free Infographic!</a></p>
<p><a href="http://marketpress.com/2013/multilingual-wordpress/" title="WordPress Multilingual" target="_blank">Multilingual WordPress with Multisite? Yes!</a></p>
<p><a href="Creating and customizing Child Themes" title="WordPress Child Themes" target="_blank">Creating and customizing Child Themes</a></p>
<h2><a href="http://inpsyde.com/en/blog/" target="_blank">So check out the daily posts on inpsyde.com and enjoy!</a></h2>
<p>More information about this tradition and what you can expect for the next 24 days can be found <a href="https://inpsyde.com/en/wordpress-advent-calendar-2017/" title="WordPress Tips and Tricks" target="_blank">here</a>!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2652/every-day-a-post-of-wordpress-tipps-and-tricks-until-christmas/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Download the new Xtreme One WordPress Framework for free and test now!</title>
		<link>https://wpengineer.com/2639/download-wordpress-framework-for-free/</link>
					<comments>https://wpengineer.com/2639/download-wordpress-framework-for-free/#comments</comments>
		
		<dc:creator><![CDATA[Alex]]></dc:creator>
		<pubDate>Mon, 28 Oct 2013 16:45:57 +0000</pubDate>
				<category><![CDATA[WordPress News]]></category>
		<category><![CDATA[WordPress Themes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Theme]]></category>
		<category><![CDATA[WordPress Widget]]></category>
		<category><![CDATA[Xtreme One]]></category>
		<guid isPermaLink="false">http://wpengineer.com/?p=2639</guid>

					<description><![CDATA[With pleasure we can now announce that Xtreme One 1.6 was released as a beta last week! Xtreme One WordPress Framework gives you the freedom to easily create your WordPress Themes. No more inflexible layouts or having to change the code all the time. With the powerful framework you are able to realize your ideas [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="http://marketpress.com/2013/xtreme-one-1-6-beta-with-yaml-4-integration-open-beta-for-testing/"><img loading="lazy" decoding="async" src="https://wpengineer.com/wp-content/uploads/xtreme-1000x400-150x150.jpg" alt="xtreme-1000x400-150x150" width="150" height="150" class="alignleft size-full wp-image-2640" /></a>With pleasure we can now announce that Xtreme One 1.6 was released as a beta last week! Xtreme One WordPress Framework gives you the freedom to easily create your WordPress Themes. No more inflexible layouts or having to change the code all the time. With the powerful framework you are able to realize your ideas very quickly.</p>
<p>Xtreme One is the world’s only WordPress framework that allows solid, fluid and flexible layouts.</p>
<p>With Xtreme One 1.6 also comes the possibility to adapt Xtreme One Widgets to your own needs or create custom widgets, an example is supplied in /xtreme-blank/ Child Theme. The Grid post widgets now support custom post types. Therefore an infinite number of options are available with just a few clicks to reposition content.</p>
<p>Using the unique content widgets you can integrate any widget in the post editor. Of particular interest would it for portfolio websites, certain posts in multiple columns responsive and fluid. </p>
<p>Xtreme One comes with 15 awesome Widgets, try out all of them and you will be amazed!</p>
<p><a href="http://marketpress.com/product/xtreme/" title="WordPress Framework Xtreme" target="_blank">You can find more information about the powerful WordPress Framework here!</a></p>
<h2><a href="http://marketpress.com/feedback/xtreme-one-1-6-open-beta-free-download/" title="Download Xtreme One for free!" target="_blank">Download and test it for free</a></h2>
<p>Beta testing ends 30.11.2013!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://wpengineer.com/2639/download-wordpress-framework-for-free/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
	</channel>
</rss>
