Tagg Wordpress

WordPress pluginguide: Sätta ny titel i en shortcode

Jag håller på med ett Reddit-liknande WordPress-plugin på ett projekt hos Populate.

Systemet listar ett antal frågor som du som besökare kan ”rösta upp”, sedan visar man de populäraste frågorna och lite annat. Varje fråga har en egen landningssida, exempelvis /fraga/10 (där 10 är id:t på frågan). Landningssidan och listningen av frågorna definieras av shortcodes i sidor, exempelvis: [poll_show_single] och [poll_list].

På sidan som innehåller [poll_show_single], i det här fallet är det sidan ‘fraga’, vill jag ha möjlighet att sätta frågans rubrik som ny titel (via filtret wp_title).

Det går tyvärr inte att ändra titeln inifrån shortcoden, utan man får identifiera vilken sida som shortcoden finns på och sen sätta titeln separat. Detta kan du göra på följande sätt:

function locate_shortcode ($shortcode) {
  global $wpdb;
 
  $search = ((!empty($search))?" OR ":"")."post_content LIKE '%$shortcode%'";
 
  $query = "SELECT ID,post_title,post_name,post_content FROM $wpdb->posts WHERE $search AND post_type='page'";
  $result = $wpdb->get_results($query);
 
  return array('id' => $result[0]->ID, 'title' => $result[0]->post_title, 'name' => $result[0]->post_name, 'uri' => get_page_uri($result[0]->ID) );
}

Sedan läser du av den:

$pollSingle = locate_shortcode( 'poll_show_single' );  
$pollSingleURI = $pollSingle['uri'];

Då får jag fram vilken sida som innehåller shortcoden för att visa en enskild fråga, därefter kan jag haka in mig på filtret ‘wp’ och sätta titeln:

add_filter('wp', 'titles' );

I titels() kollar vi sedan upp om vi står på rätt sida (den som finns i $pollSingleURI) och jämför den med $wp_query->query['pagename']:

function titles() {
  global $wp_query, $wpdb, $newTitle, $pollSingleURI;
 
  // Single poll
  if ($wp_query->query['pagename'] == $pollSingleURI) {
    if (preg_match("/\d+\/?$/", $wp_query->query['page'])) {
      $pollID = str_replace('/', '', $wp_query->query['page']);
      $result = $wpdb->get_results( sprintf("SELECT subject FROM %spoll WHERE id = %d LIMIT 1", $wpdb->prefix, $wpdb->escape($pollID) ) );
 
      // Set title
      $newTitle = esc_html($result[0]->subject);
      add_filter('wp_title', 'frontend_set_title' , 10, 2 );
    }
  }
}

Ovanstående SQL-fråga hämtar just nu frågans titel, men detta ändrar du givetvis till det du vill ha som titel.

Och eftersom PHP fortfarande har lite problem med closures/anonyma funktioner så måste titeln sättas separat:

function frontend_set_title($title, $separator) {
  global $newTitle;
  return esc_html($newTitle)." ".$separator;
}

Allt är ryckt ur en klass för att lättare kunna visa hur det fungerar, därav alla globala variabler *urk*. Denna metod kräver inga ”rewrites” eller ”template redirect intercepts”.

Visa ID på Media i WordPress

Jag hade nyss ett behov på jobbet att visa vilket ID ett objekt har i mediaredigeraren (WordPress). Detta kan vara bra att ha när man ska bygga gallerier, framförallt när man exkluderar vissa bilder genom att använda ID:et.

Kod:

add_filter('attachment_fields_to_edit', 'enable_media_id', 10, 2);
function enable_media_id( $form_fields, $post ) {
    $form_fields["enable-media-id"] = array("label" => "MediaID", "input" => "html", "html" => "<p>".$post->ID."</p>");
 
    return $form_fields;
}

Bild på hur det kommer se ut:

(Jag såg idag att någon hade önskat denna funktionaliteten på WordPress.org -> Ideas)

Nyheter kring Shopp 1.1

Utveckligen av Shopp går i en rasande fart framåt. Just nu fokuserar utvecklarna främst på att se till att göra kodbasen stabil och se till att allting fungerar.

Jag nämnde i mitt senaste inlägg kring Shopp att en alpha-version skulle dyka upp ganska kort efter att det postades. Den har dykt upp för ganska länge sedan och det ser riktigt bra ut, det som har fått mycket fokus är baksidan, alltså källkoden, det gör att det inte är några jättestora förändringar utseendemässigt. Det är förvisso lite enklare att hitta i orderdetaljerna och en andra småsaker.

Något som jag trivs riktigt bra med är hanteringen av betalningsmodulerna, jag var med Jonathan Davis (huvudutvecklare) en kväll och vi gjorde i ordning Payson-modulen så den är kompatibel med 1.1. Jisses vilken skillnad i kod jämfört med den tidigare versionen 1.0.x.

Momssatser för specifika kategorier är även det möjligt, men det är lite finputsning på det kvar innan den fungerar klockrent.

Så, när kommer den?

Det som just nu tar tid är QA-delen, att se till att allting funkar. Det har varit lite dåligt med testning från min egen sida, men jag räknar med att sätta igång ordentligt någon gång under nästa vecka. Det nämndes i en videointervju med Jonathan att de siktade på slutet av juni, men det är flytande.

Blandad information om Shopp

Jag får ganska mycket frågor om WordPress-tillägget Shopp som jag är inblandad i, så jag tänkte ta tillfället i akt och skriva om det.

Payson-betalningsmodul

Det finns en betalningsmodul för Payson att köpa som tillägg i Shopp. Jag är inte ansvarig för utvecklingen av den, det sköter Ingenesis Ltd (företaget bakom Shopp), däremot så har jag hjälpt till i utvecklingen.

Det har även kommit till min kännedom att det finns ex. rabatter inte fungerar fullt ut, vi får se ifall Ingenesis Ltd väljer att åtgärda dessa innan 1.1 (se mer nedan).

Svenska översättningen

Jag underhåller och uppdaterar för närvarande den svenska översättningen av Shopp. Hittar ni någon översättning som inte stämmer eller någon som saknas någonstans i systemet, kontakta mig så ska jag försöka ordna det.

Shopp 1.1

Jag är med i beta-teamet för Shopp, det innebär att jag hjälper till att hitta buggar och kan lägga in förslag på nya funktioner. Det var tänkt att det skulle bli en 1.0.18 av Shopp,  men den idén har slopats och de kommer att satsa på 1.1 Jag vet inte när 1.0.18 kommer. Förhoppningsvis dyker en alpha-version upp ganska kort (~1 vecka).

Några av nyheterna i 1.1

  • Ny hantering av betalningsmoduler/fraktmoduler
    Systemet som finns just nu för att skriva egna betalningslösningar/fraktmoduler är rent ut sagt obegripligt. Det kommer att ändras till det bättre och förhoppningsvis bli riktigt bra!
  • Moms
    Just nu finns det inga möjligheter att sätta specifik moms på vissa produkter, det kommer förhoppningsvis att komma med i 1.1
  • Sessionshantering
    I dagsläget är det ganska rörigt att hålla koll på sessioner som skapas i Shopp och WordPress. Drömmen vore ifall WordPress implementerade ett eget system som andra tillägg kan ”hooka” in sig på, men jag har inte sett något om det på deras tidsplan.

Ni kan läsa tidsplanen i sin helhet på Shopps webbplats: Beta_Team:Roadmap

Vad jag saknar i WordPress

2010-01-08 20:39 – Ändrade rubriken från ”Saker jag ogillar med WordPress” till ”Vad jag saknar i WordPress”

WYSIWYG

Snarare: WYSIWTF (What You See Is WTF). Den ursprungliga idén med editorn var att förhindra att folk la in komplexa HTML-stycken, men just nu begränsar den alldeles för mycket. Den fungerar för den vanliga användaren, men så fort jag försöker göra något utöver det vanliga får jag ta till lite knep och knåp för att få det att fungera.

Standardinstallationen

Då WordPress är en så pass populär mjukvara så gör det att många WordPress-installationer blir mål vid en eventuell säkerhetslucka. Om denna säkerhetslucka utnyttjar något som ingår i standardinstallationen (ex: databasprefix eller administratörskontot) så är många illa ute.

Saker jag gör vid en nyinstallation:

  • Ändrar databasprefixet
  • Byter administratörskontots användarnamn
  • Flyttar ut wp-config.php utanför WordPress-katalogen (oåtkomlig)
  • Ser till att rättigheterna på katalogerna stämmer
  • (Tema) Tar bort WordPress versionsnummer i head-taggen.

Jag skulle även gärna vilja byta ut alla hänvisningar till WordPress-kataloger på webbplatsen (ex: wp-content), just nu är det för mycket meck för att detta ska vara hållbart. Mycket av ovanstående saker borde användaren tvingas göra vid installationen (möjligt att detta försämrar WordPress ”välkänt” korta installationstid).

Sidhantering och menylistning

Just nu är sidhanteringen ohållbar, för att få menyobjekt att hamna i den ordning jag vill utan att hålla koll på prioriteten så krävs ett tillägg som ex. pageMash.

Det finns heller ingen chans att utesluta sidor i administrationen utan det görs manuellt via wp_list_pages() eller ett plugin som Page Lists Plus (där jag även kan vilja vilket namn som ska synas i menyn).

Javascript

Bättre möjligheter för att få kontroll över vilka Javascript och stilmallar som köas. Jag skulle vilja ha möjlighet att bunta ihop dessa till en fil. Mycket av ansvaret för att köa filer ligger på tilläggsutvecklare, många lägger in dessa manuellt utan att köa dem.

Några småsaker

  • Det finns ingen möjlighet till intern länkning. Ex: RB Internal Links
  • ”Custom fields” – bättre möjligheter för att lätt kunna skapa olika typer av mallar där fördefinerade fält enkelt kan fyllas i (dålig förklaring?).
  • Page vs Posts – Blir alldeles för krångligt så fort jag försöker kombinera två loopar, suck…

Sammanfattning

Jag hoppas att många av dessa saker ordnas i WordPress 3.0, det mesta av detta går att lösa genom att använda tredjeparts-tillägg. Jag tror att dessa saker skulle gå att lägga in i kärnan utan att göra den bloatad eller att krångla till det för mycket för slutanvändaren.

Trots ovanstående ”brister” så gillar jag WordPress och projektet utvecklas åt rätt håll känns det som.

(Ovanstående lista är skriven med fokus på WordPress som CMS, inte bloggverktyg)

© Copyright 2002 - 2010 Anders Hassis

Byggt på Notes Blog Core