Wordpress

Wordpress detta älskade CMS! Från att ha börjat som en enklare bloggplattform är det idag världens mest använda CMS med ett starkt community bakom sig och kan användas till så mycket mer än bara bloggar. Här hittar du allt ifrån plugins och teman till hur man manuellt modifierar skript.

Invaktivera fildelning – säkra din WP-sajt

Som några av er vet så råkade denna sajt ut för ett litet hax för ett tag sedan. Efter det har jag kontinuerligt letat efter alla möjliga sätt att säkra upp att det inte skall hända igen. Tänkte under en oregelbunden serie dela med mig av trick jag har snappat upp. Here we go.

Inaktivera fileditering

Per default tillåter WordPress administratörer att editera PHP-filer inom det tema och de plugins som du använder sig av. Detta utnyttjas ofta av haxare med onda avsikter att exekvera kod, förutsatt att de lyckas logga in. Men du kan skydda dig mot detta. Genom att lägga in en simpel rad i filen wp-config kan du stänga av möjligheten för användare att editera filer från WordPress dashboard och därmed skydda dig.

define('DISALLOW_FILE_EDIT', true);

Att lägga in ovanstående rad kan jämföras med att ta bort ‘edit_themes’, ‘edit_plugins’ och ‘edit_files’ för alla användare.

Achtung! Smush.it orsakar strul i WP

I en tidigare post rekommenderade jag pluginet WP Smush.it för att optimera bilder och därmed sänka laddningstiden. De senaste veckorna har jag haft problem med att ladda upp bilder till bloggen, det slutar oftast med ett HTTP error meddelande. Efter lite felsökning stötte jag på detta inlägg där utvecklaren berättar att det beror på ett (förhoppningsvis) övergående problem som helt har med Yahoos tjänst att göra. Så om ni upplevt samma problem med uppladdning av bilder, avaktivera pluginet tillsvidare.

Adios.

pTypeConverter, konvertera posts till pages och tillbaka!

Så här glad blir jag av att jobba med WP, och det slutar aldrig att hagla bra plugins. Idag stötte jag på ett trevligt litet plugin som konverterar poster till pages (och tvärtom). Varför behöver man det tänker ni?

Jo längst vägen kan man t.ex. upptäcka att page och posts skiljer sig åt rejält och det som hade en liten betydelse i början kräver plötsligt ett större fokus. Upptäcker man att man klantat sig så behöver innehållet migreras och det är ett extremt tråkigt jobb. Vad göra?

Jo ladda ner pluginet pTypeConverter (utvecklad av Brian Goad)! Där markerar du enkelt ut vilka posts eller pages du vill konvertera och ett knapptryck senare så är det färdigt.

Hallelujah!

Så säkrar du din WP-sajt!!!

Alltför ofta hamnar jag i möten där rädslan för att använda open source plattformar är så stort att den sätter käpphästar för alla logiska resonemang. Rädslan kretsar främst kring säkerheten gällande produkterna, är det säkert? Men det är ju öppen källkod? Men om? Tänk att? Osv osv..

Den första insikten man behöver gällande säkerhet är att den största säkerhetsrisken är användarna själva. Det kan handla om att de inte loggar ut ur en tjänst, de lämnar datorn olåst, har ingen PIN på mobilen eller är allmänt slarviga med säkerheten vid sådana liknande tillfällen.

Den andra insikten som bör finnas är att säkerhetsrisken kan aldrig någonsin vara = noll. Om någon vill “hacka” sig in i ditt system och om denne har de rätta förutsättningarna och kompetensen så finns det inte mycket du kan göra åt det. Punkt.

hacker

Vill han så kan han

Men… självklart kan du göra det lite mindre lätt för dessa personer och alla andra att faktiskt ta sig in i ditt system. Råkar du ha en WP-sajt så kommer här lite slides med en hel del bra råd som är lätta att implementera och som höjer säkerheten (många saker är sunt förnuft som säkert kan utnyttjas på flera CMS). Dessa punkter är:

  • Uppdatera både plugins och CMS, nya uppdateringar innehåller oftast säkerhetspatchar
  • Byt tabellprefixet i din databas så du inte använder dig av “wp_”
  • Kryptera delar av “wp-config.php” och lägg den i katalogen under den katalog du har din WP-installation (kommer hittas ändå)
  • Utnyttja SSL för alla admin-sidor
  • Skapa en .htacess-fil som tillåter redigering från endast givna IP-adresser
  • Använd säkra teman och plugins
  • Använd inte “Admin” som login till admingränssnittet
  • Byt rättigheterna på dina kataloger till 644

Rekommenderar starkt att ta en titt på slidsen nedanför som ger en lite mer ingående förklaring på saker och ting.

Scho.

Custom sidebars – det fantastiska WP-pluginet!

Ibland så vill man som sajtägare visa olika information i kolumerna beroende på vad som visas i huvudkolumnen. Tyvärr så har WordPress stöd för detta inte varit så bra fram tills det fantastiska pluginet Custom Sidebars dök upp. Pluginet tillåter dig att anpassa widgeterna i dina sidkolumner helt efter tycke och smak. Antingen så kan du skapa kolumner och koppla de till kategorier eller helt enkelt skapa unika kolumner för varje enskid post och sida. You choose!

Oavsett om du som jag kännt dig begränsad av detta så rekommenderar jag starkt detta plugin. Lycka till & gnatt.

Lägg till “Custom URL” till bilderna i ditt WP-galleri

Ett problem som finns i WordPress standardgalleri är den begränsade länkningen. Antingen så kan du länka en tumnagel från galleriet direkt till bilden, vilket oftast inte blir så snyggt, eller till en sida som visar bilden, snyggare men inte alltid rätt. Själv har jag ibland behovet att länka olika tumnaglar till externa sidor (se exempel) och det är alltså inte möjligt med den uppsättning som WordPress har idag. Men, givetvis finns det en lösning!

Nick Brewer, som driver bloggen Geek Media, har skrivit några rader som gör det möjligt att länka tumnaglarna till andra URL:ar än till själva bilden. Antingen så går du direkt till hans blogg och läser inlägget eller så tar du den nedanstående koden och klistrar in i din “functions.php” fil i temat. Därefter går du till galleriet och fyller i det nya “Custom URL”fältet som dykt upp med den önskade URL:en.

Koden lägger till ett inputfält knutet till galleriet samt ändrar adderar lite funktioner till kärnan. Funkar grymt bra!

<?php
/* -------------------------------
CUSTOM LINK PER GALLERY IMAGE
------------------------------- */
function rt_image_attachment_fields_to_edit($form_fields, $post) {
  $form_fields["rt-image-link"] = array(
    "label" => __("Custom Link"),
    "input" => "text", // default
    "value" => get_post_meta($post->ID, "_rt-image-link", true),
    //"helps" => __("To be used with special slider added via [rt_carousel] shortcode."),
  );
  return $form_fields;
}
add_filter("attachment_fields_to_edit", "rt_image_attachment_fields_to_edit", null, 2);
function rt_image_attachment_fields_to_save($post, $attachment) {
  // $attachment part of the form $_POST ($_POST[attachments][postID])
  // $post['post_type'] == 'attachment'
  if( isset($attachment['rt-image-link']) ){
    // update_post_meta(postID, meta_key, meta_value);
    update_post_meta($post['ID'], '_rt-image-link', $attachment['rt-image-link']);
  }
  return $post;
}
add_filter("attachment_fields_to_save", "rt_image_attachment_fields_to_save", null , 2);
/* -------------------------------
MODIFIED CORE FUNCTION
------------------------------- */
add_shortcode('gallery', 'geekee_gallery_shortcode');
/**
* The Gallery shortcode.
*
* This implements the functionality of the Gallery Shortcode for displaying
* WordPress images on a post.
*
* @since 2.5.0
*
* @param array $attr Attributes attributed to the shortcode.
* @return string HTML content to display gallery.
*/
function geekee_gallery_shortcode($attr) {
  global $post, $wp_locale;
  static $instance = 0;
  $instance++;
  // Allow plugins/themes to override the default gallery template.
  $output = apply_filters('post_gallery', '', $attr);
  if ( $output != '' )
    return $output;
  // We're trusting author input, so let's at least make sure it looks like a valid orderby statement
  if ( isset( $attr['orderby'] ) ) {
    $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
    if ( !$attr['orderby'] )
      unset( $attr['orderby'] );
  }
  extract(shortcode_atts(array(
    'order'      => 'ASC',
    'orderby'    => 'menu_order ID',
    'id'         => $post->ID,
    'itemtag'    => 'dl',
    'icontag'    => 'dt',
    'captiontag' => 'dd',
    'columns'    => 3,
    'size'       => 'thumbnail',
    'include'    => '',
    'exclude'    => ''
  ), $attr));
  $id = intval($id);
  if ( 'RAND' == $order )
    $orderby = 'none';
  if ( !empty($include) ) {
    $include = preg_replace( '/[^0-9,]+/', '', $include );
    $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    $attachments = array();
    foreach ( $_attachments as $key => $val ) {
      $attachments[$val->ID] = $_attachments[$key];
    }
  } elseif ( !empty($exclude) ) {
    $exclude = preg_replace( '/[^0-9,]+/', '', $exclude );
    $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
  } else {
    $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
  }
  if ( empty($attachments) )
    return '';
  if ( is_feed() ) {
    $output = "\n";
    foreach ( $attachments as $att_id => $attachment )
      $output .= wp_get_attachment_link($att_id, $size, true) . "\n";
    return $output;
  }
  $itemtag = tag_escape($itemtag);
  $captiontag = tag_escape($captiontag);
  $columns = intval($columns);
  $itemwidth = $columns > 0 ? floor(100/$columns) : 100;
  $float = is_rtl() ? 'right' : 'left';
  $selector = "gallery-{$instance}";
	$gallery_style = $gallery_div = '';
	if ( apply_filters( 'use_default_gallery_style', true ) )
		$gallery_style = "
		<style type='text/css'>
			#{$selector} {
				margin: auto;
			}
			#{$selector} .gallery-item {
				float: {$float};
				margin-top: 10px;
				text-align: center;
				width: {$itemwidth}%;
			}
			#{$selector} img {
				border: 2px solid #cfcfcf;
			}
			#{$selector} .gallery-caption {
				margin-left: 0;
			}
		</style>
		<!-- see gallery_shortcode() in wp-includes/media.php -->";
	$size_class = sanitize_html_class( $size );
	$gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";
	$output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );
  $i = 0;
  foreach ( $attachments as $id => $attachment ) {
    $link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, true, false);
  /* -------------------------------
  MODIFICATION ################
  ------------------------------- */
  $image = wp_get_attachment_image($id, $size, false);
  $attachment_meta = get_post_meta($id, '_rt-image-link', true);
  if($attachment_meta){
    if($attr['link'] == 'custom_url'){
      $link = $attachment_meta;
    }
  }
  $output .= "<{$itemtag} class='gallery-item'>";
  $output .= "<{$icontag} class='gallery-icon'>";
    /* -------------------------------
  MODIFICATION ################
  ------------------------------- */
  if($attachment_meta){
    $output .= "<a href='$link' target='_blank'>$image</a>";
  } else {
    $output .= $link;
  }
  $output .= "</{$icontag}>";
  if ( $captiontag && trim($attachment->post_excerpt) ) {
    $output .= "<{$captiontag} class='gallery-caption'>" . wptexturize($attachment->post_excerpt) . "</{$captiontag}>";
  }
  $output .= "</{$itemtag}>";
  if ( $columns > 0 && ++$i % $columns == 0 )
    $output .= '<br style="clear: both;" />';
  }
  $output .= "<br style='clear: both;' /></div>\n";
  return $output;
}
 Scroll to top