Redirect 301 cu .htaccess, exclude imaginile

Zilele trecute când am combinat toate blogurile mele într-acesta, mi-am dat seama că ar fi mult prea complicat să import și imaginile în noul blog. Galeriile media ale celor 2 bloguri aveau în total mai mult de 500 Mb, iar importul ar fi consumat ceva resurse și timp. Astfel că am ales să păstrez imaginile pe vechile URL-uri și să import doar articolele redirectate 301 cu .htaccess.

Redirectul 301 clasic din .htaccess are următoarea sintaxă

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.eugenpaun.ro/category/wordpress/$1 [R=301,L]

Totul funcționează corect, mai puțin imaginile care, din păcate, se vor va redirecta greșit. Așa că vom modifica sintaxa pentru a exclude fișierele imagine cu extensia jpg, gif și png. Adaptează după cum ai nevoie, funcționează și pentru alte tipuri de fișiere – HTML, PDF sau PHP.

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{REQUEST_URI} !.png$ [NC]
RewriteCond %{REQUEST_URI} !.jpg$ [NC]
RewriteCond %{REQUEST_URI} !.gif$ [NC]
RewriteRule (.*) http://www.eugenpaun.ro/category/wordpress/$1 [R=301,L]

Autentificare în WordPress cu adresa de mail în loc de utilizator

Autenficarea cu adresa de mail în locul unui utilizator este mai intuitivă. Este mai simplu să îți aduci aminte una dintre adresele de mail pe care le folosești în mod curent decât încă un nume de utilizator. Copiază în fișierul functions.php al temei activate în mod curent codul de mai jos. Autentificarea cu nume de utilizator va funcționa în paralel.

function login_with_email_address($username) {
	$user = get_user_by_email($username);
	if(!empty($user->user_login))
		$username = $user->user_login;
	return $username;
}
add_action('wp_authenticate','login_with_email_address');

Sursa

Oprește dezactivarea pluginurilor și schimbarea temei WordPress

Dacă folosești funcționalitatea de CMS a WordPress pentru a crea site-uri pentru clienți, probabil știi cât de curioși sunt unii dintre ei și de prea multe ori te-ai trezit cu tema sau pluginuri dezactivate. Astfel site-ul își va pierde din funcționalitate și fără designul personalizat la care ai muncit.

Copy/paste în functions.php pentru a opri editarea și dezactivarea pluginurilor WordPress

add_filter( 'plugin_action_links', 'slt_lock_plugins', 10, 4 );
function slt_lock_plugins( $actions, $plugin_file, $plugin_data, $context ) {
	// Remove edit link for all
	if ( array_key_exists( 'edit', $actions ) )
		unset( $actions['edit'] );
	// Remove deactivate link for crucial plugins
	if ( array_key_exists( 'deactivate', $actions ) && in_array( $plugin_file, array(
		'slt-custom-fields/slt-custom-fields.php',
		'slt-file-select/slt-file-select.php',
		'slt-simple-events/slt-simple-events.php',
		'slt-widgets/slt-widgets.php'
	)))
		unset( $actions['deactivate'] );
	return $actions;
}

Pentru a selecta un anumit plugin trebuie să introduci calea relativă la wp-content/plugins către fișierul principal al pluginului. De exemplu pentru pluginul antispam Akismet aceasta este akismet/akismet.php – caută fișierul care are exact la început declarațiile privind numele, descrierea și autorului pluginului. Înlocuiește array-ul din codul de mai sus și completează-l cu oricâte de multe pluginuri esențiale pentru buna funcționare a site-ului.

La fel pentru a opri editarea și schimbarea temei curente WordPress folosește acest cod

add_action( 'admin_init', 'slt_lock_theme' );
function slt_lock_theme() {
	global $submenu, $userdata;
	get_currentuserinfo();
	if ( $userdata->ID != 1 ) {
		unset( $submenu['themes.php'][5] );
		unset( $submenu['themes.php'][15] );
	}
}

Meniul Themes și submeniul Themes – Editor va fi disponibil doar pentru utilizatorul ID=1 care, în mod normal, ar trebui să fie developerul acelui site ce rulează sub WordPress.

Codul via Steve Taylor.

Code snippets pentru căutarea WordPress

Câteva code snippets care îmbunătățesc funcționalitatea de căutare într-un blog WordPress. Majoritatea se pot implementa printr-un simplu copy/paste, citiți cu atenție unde anume trebuie introdus fiecare snippet.

Exclude o anumită categorie din rezultatele căutării
Copy/paste în fișierul search.php exact înainte de loop, personalizează cu ID-ul categoriei ale cărei rezultate nu le dorește în căutare.

<?php
          query_posts($query_string . '&cat=-3');
?>

Evidențiază termenii căutării în rezultate
Adaugă în functions.php al temei WordPress activate în mod curent

function hls_set_query() {
  $query  = attribute_escape(get_search_query());
  if(strlen($query) > 0){
    echo '
      <script type="text/javascript">
        var hls_query  = "'.$query.'";
      </script>
    ';
  }
}
function hls_init_jquery() {
  wp_enqueue_script('jquery');
}
add_action('init', 'hls_init_jquery');
add_action('wp_print_scripts', 'hls_set_query');

Deschide header.php și copiază codul de mai jos, eventual personalizează culoare de background pentru evidențiere – în exemplu este D3E18A

<style type="text/css" media="screen">
    .hls { background: #D3E18A; }
  </style>
  <script type="text/javascript">
  jQuery.fn.extend({
    highlight: function(search, insensitive, hls_class){
      var regex = new RegExp("(<[^>]*>)|(\b"+ search.replace(/([-.*+?^${}()|[]/\])/g,"\$1") +")", insensitive ? "ig" : "g");
      return this.html(this.html().replace(regex, function(a, b, c){
        return (a.charAt(0) == "<") ? a : "<strong class=""+ hls_class +"">" + c + "</strong>";
      }));
    }
  });
  jQuery(document).ready(function($){
    if(typeof(hls_query) != 'undefined'){
      $("#post-area").highlight(hls_query, 1, "hls");
    }
  });
  </script>

Afișează numărul de rezultate al căutării
Copiază în fișierul search.php

<h2 class="pagetitle">Search Result for <?php /* Search Count */ $allsearch = &new WP_Query("s=$s&showposts=-1"); $key = wp_specialchars($s, 1); $count = $allsearch->post_count; _e(''); _e('<span class="search-terms">'); echo $key; _e('</span>'); _e(' &mdash; '); echo $count . ' '; _e('articles'); wp_reset_query(); ?></h2>

Limitează căutarea numai la titlul articolelor
Pentru a căuta doar în titlurile articolelor copy/paste în functions.php

function __search_by_title_only( $search, &$wp_query )
{
    if ( empty($search) )
        return $search; // skip processing - no search term in query
    $q =& $wp_query->query_vars;
    // wp-includes/query.php line 2128 (version 3.1)
    $n = !empty($q['exact']) ? '' : '%';
    $searchand = '';
    foreach( (array) $q['search_terms'] as $term ) {
        $term = esc_sql( like_escape( $term ) );
        $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
        $searchand = ' AND ';
    }
    $term = esc_sql( like_escape( $q['s'] ) );
    if ( empty($q['sentence']) && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] )
        $search .= " OR ($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
    if ( !empty($search) ) {
        $search = " AND ({$search}) ";
        if ( !is_user_logged_in() )
            $search .= " AND ($wpdb->posts.post_password = '') ";
    }
    return $search;
}
add_filter( 'posts_search', '__search_by_title_only', 10, 2 );

Redirectează la articol dacă există un singur rezultat al căutării
Bucata de cod următoare își are locul în functions.php

add_action('template_redirect', 'single_result');
function single_result() {
    if (is_search()) {
        global $wp_query;
        if ($wp_query->post_count == 1) {
            wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
        }
    }
}

Rescrie permalink-ul paginilor de căutări cu /search/termen-cautare în loc de ?s=termen-cautare
Copy/paste în functions.php

function search_url_rewrite_rule() {
	if ( is_search() && !empty($_GET['s'])) {
		wp_redirect(home_url("/search/") . urlencode(get_query_var('s')));
		exit();
	}
}
add_action('template_redirect', 'search_url_rewrite_rule');

Dezactivează complet funcționalitate de căutare
Pentru un site static cu un număr redus de pagini copiază în functions.php

function fb_filter_query( $query, $error = true ) {
	if ( is_search() ) {
		$query->is_search = false;
		$query->query_vars[s] = false;
		$query->query[s] = false;
		// to error
		if ( $error == true )
			$query->is_404 = true;
	}
}
add_action( 'parse_query', 'fb_filter_query' );
add_filter( 'get_search_form', create_function( '$a', "return null;" ) );

Ultimele articole pe un blog colectiv

Recent a trebuit să creez o listă a ultimelor articole pentru un blog colectiv. Deoarece nu toți autorii aveau aceeași frecvență de publicare a articolelor trebuia să afișez ultimul articol al fiecărui autor indiferent de data adăugări pentru 4 autori în total. Rezultatul este codul de mai jos; în plus am eliminat categoria cu ID-ul 9, categoria ce conține anunțuri administrative.

<?php $authors = get_users_of_blog(); ?>

<?php
$latest_posts = array();
foreach ( $authors as $author ) {
$user = new WP_User( $author->ID );
if ($user->has_cap(‘level_7′))
continue;
$ps = get_posts('numberposts=1&post_type=post&author=' . $author->ID . '&cat=-9');
foreach ($ps as $p) {
$latest_posts[$p->post_date] = $p;
}
}
krsort($latest_posts);
?>
<?php //query_posts(‘author=’ . $author->ID . ‘&showposts=1&cat=-9′); ?>
<?php
$counter =0;
foreach ($latest_posts as $post) {
$counter++;
if ($counter > 4)
break;
setup_postdata($post);
?>
<?php // while (have_posts()) : the_post(); ?>
<li>
<?php userphoto_the_author_thumbnail(); ?>
<span class=”blogauthor”> <?php the_author_posts_link(); ?> </span>
<div class=”blog”>    <a title=”Permanent Link to <?php the_title(); ?>” href=”<?php the_permalink() ?>” rel=”bookmark”><?php the_title(); ?></a></div>
<br />
<?php  the_excerpt(); ?> <strong><a title=”Permanent Link to <?php the_title(); ?>” href=”<?php the_permalink() ?>”>Read more</a>   </strong>
</li>
<?php } ?>
<?php // }; ?>

Pentru afișarea unei imagini pentru fiecare autor, imaginea era încărcată local, nu se folosește Gravatar.com, am folosit pluginul User Photo. Acesta permite uploadul a diverse formate de imagini și crează automat două dimensiuni ale imaginii de profil.

Înainte de formatarea cu CSS a listei rezultatul arată precum în imaginea de mai jos. Stilizează rezultatul în funcție de tema folosită.

Drop Caps fără plugin

Pentru a crea efectul de drop caps fără un plugin avem de luat cu copy/paste două porțiuni de cod.

Deschide functions.php al temei activate și copy/paste codul PHP de mai jos

function post_first_letter($content = '') {
		$pattern = '/<p( .*)?( class="(.*)")??( .*)?>((<[^>]*>|s)*)(("|“|‘|‘|“|')?[A-Z])/U';
		$replacement = '<p><span title="$7" class="post-first-letter">$7</span>';
		$content = preg_replace($pattern, $replacement, $content, 1 );

	return $content;
}

add_filter('the_content', 'post_first_letter');

În fișierul style.css introdu următoarele reguli CSS – modifică după preferință.

.post-first-letter {
font-size: 50px;
float: left;
margin-top: 14px;
margin-right: 5px;
}

Done!

Dezactivează toate feed-urile WordPress

Pentru site-urile statice, de prezentare feed-ul RSS sau Atom este absolut inutil. De aceea este o idee bună să îl dezactivezi. Modifică atenționarea privind dezactivarea feed-urilor după cum ai nevoie.

function fb_disable_feed() {
wp_die( __('No feed available,please visit our <a href="'. get_bloginfo('url') .'">homepage</a>!') );
}

add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);

Afișează notificările de actualizare doar pentru administratori

Pe majoritatea blogurilor pe care le administrez autorii au drept de editor. Deoarece monitorizez actualizările necesare nu doresc sa apară notificări decât pentru administratori. Copy/paste în functions.php și salvează!

// REMOVE THE WORDPRESS UPDATE NOTIFICATION FOR ALL USERS EXCEPT SYSADMIN
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) { // checks to see if current user can update plugins
add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
}

Sursa

Redimensionează automat imaginile la upload

Majoritatea utilizatorilor mai atehnici vor încărca imaginile realizate de o cameră foto fără să le redimensioneze în prealabil. Cum nu este de nici un folos nimănui o imagine de peste 1200px, codul de mai jos introdus în functions.php va redimensiona la upload orice imagine în concordanță cu setarea maximă, Large size din Settings – Media.

/**resize on upload to the largest size in media setting */


function replace_uploaded_image($image_data) {
// if there is no large image : return
if (!isset($image_data['sizes']['large'])) return $image_data;

// path to the uploaded image and the large image
$upload_dir = wp_upload_dir();
$uploaded_image_location = $upload_dir['basedir'] . '/' .$image_data['file'];
$large_image_location = $upload_dir['path'] . '/'.$image_data['sizes']['large']['file'];

// delete the uploaded image
unlink($uploaded_image_location);

// rename the large image
rename($large_image_location,$uploaded_image_location);

// update image metadata and return them
$image_data['width'] = $image_data['sizes']['large']['width'];
$image_data['height'] = $image_data['sizes']['large']['height'];
unset($image_data['sizes']['large']);

return $image_data;
}
add_filter('wp_generate_attachment_metadata','replace_uploaded_image');

Sursa

Adaugă iframes în editorul vizual WordPress

Dacă foloșesti în mod frecvent editorul vizual pentru a scrie articole în WordPress știi prea bine că nu poți insera iframes precum Google Docs forms sau Google Maps. Am mai discutat despre iframes în WordPress, dar uneori este mai complicat să explici folosirea shortcodes unui utilizator mai puțin experimentat. De aceea vom „instrui” TinyMCE, editorul vizual, să nu mai proceseze iframes deloc. Copy/paste în functions.php al temei.

function fb_change_mce_options($initArray) {
	// Comma separated string od extendes tags
	// Command separated string of extended elements
	$ext = 'pre[id|name|class|style],iframe[align|longdesc|name|width|height|frameborder|scrolling|marginheight|marginwidth|src]';
	if ( isset( $initArray['extended_valid_elements'] ) ) {
		$initArray['extended_valid_elements'] .= ',' . $ext;
	} else {
		$initArray['extended_valid_elements'] = $ext;
	}
	// maybe; set tiny paramter verify_html
	//$initArray['verify_html'] = false;
	return $initArray;
}
add_filter('tiny_mce_before_init', 'fb_change_mce_options');

Sursa