Separere kommentarer og pingbacks i WordPress

De fleste bloggere setter pris på kommentarer på sidene sine, og en link til et innlegg er heller ikke å forakte. Linkene kan være fra din egen blogg, eller fra andre som av ulike årsaker ønsker å gi link til ditt innlegg. Ved standard oppsett i de fleste WordPress installasjoner vil disse linkene føre til pingbacks eller trackbacks ((Se Wikipedia for forklaring.)) sammen med kommentarene. På norsk kalt tilbakesporinger. Tilbakesporinger fra egne innlegg kan skrus av om ønskelig, enten via en plugin eller ved instillinger i WordPress ((Se kommentar fra Martin Bekkelund)) Disse vil ligge for mange temaer ligge blandet med kommentarer. Noen vil ha det slik, mens mange ønsker å gi en ryddigere oversikt over blandingen av kommentarer og tilbakesporinger. Og det er mulig å separere dette.

De som har temaer som automatisk skiller mellom kommentarer og tilbakesporinger slipper å tenke noe mer på dette. Men for oss andre, kan det jo være greit å rydde litt. Så la oss sette i gang.

Det viktigste først: Før du gjør større endringer eller oppdateringer i WordPress (og det meste annet) må du huske å ta backup!

Filen det skal redigeres i er comments.php under ditt gjeldende tema. Det er denne filen du nå skal ha tatt backup av. Jeg tar intet ansvar for all elendighet som måtte følge, skulle du mangle backup… Du har tatt backup? Fint.

Det er flere måter å skille mellom kommentarer og tilbakesporinger på. Jeg har valgt å gjøre dette på en veldig enkel måte. Jeg tar en kopi av loopen for å bla gjennom kommentarer, for så å bruke den ene loopen til kun kommentarer og den andre loopen til tilbakesporinger.

I comments.php vil du finne en loop, bestående av en foreach-løkke. Det er denne vi skal gjøre endringene ved. Hos meg så den i utgangspunktet ut som dette:

    < ?php foreach ($comments as $comment) : ?>
  1. ...
  2. < ?php /* Changes every other comment to a different class */ if ('alt' == $oddcomment) $oddcomment = ''; else $oddcomment = 'alt'; ?> < ?php endforeach; /* end for each comment */ ?>

Jeg har ikke tatt med innholdet innenfor

  • , for lesbarhetens skyld.

    Litt endringer må gjøres: < ?php foreach ($comments as $comment) : ?> < ?php if (get_comment_type() == 'comment') { ?>

  • ...
  • < ?php /* Changes every other comment to a different class / if ('alt' == $oddcomment) $oddcomment = ''; else $oddcomment = 'alt'; ?> < ?php } ?> < ?php endforeach; / end for each comment */ ?> Det er ikke store endringene som skal til. To linjer er blitt lagt til. Den første linjen er en if-setning som sjekker om kommentaren er av typen ‘comment’. Den andre linjen, < ?php } ?>, er nødvendig for å fortelle WordPress hvor if-setningen skal avsluttes. Er kommentaren av typen ‘comment’ kjøres koden innenfor if-setningen. Dette betyr i praksis at det kun er kommentarer som blir med, ikke og tilbakesporinger. Vi trenger altså en loop til.

    Vi kopierer loopen vi har, og gjør en liten endring i denne: < ?php foreach ($comments as $comment) : ?> < ?php if (get_comment_type() != 'comment') { ?>

  • ...
  • < ?php /* Changes every other comment to a different class / if ('alt' == $oddcomment) $oddcomment = ''; else $oddcomment = 'alt'; ?> < ?php } ?> < ?php endforeach; / end for each comment */ ?> Den er lik, med unntak av if-setningen som nå gjør det motsatte. Vi ønsker nå kun å kjøre koden dersom kommentarer ikke er av typen ‘comment’. Koden legger vi etter den forrige loopen.

    Du har nå to looper, en for kommentarer og en for tilbakesporinger. Tilbakesporinger vil nå komme etter kommentarene på bloggen. For å gjøre det enda litt mer oversiktlig kan det være lurt å gjøre noen endringer i loopen som tar for seg tilbakesporinger. Jeg har valgt å fjerne teksten for tilbakesporinger, samt lagt på en liten tekst som forteller om dette er en Trackback eller Pingback ved hjelp av en liten kodesnutt: if (get_comment_type() == 'pingback') { echo "Pingback"; } else if (get_comment_type() == 'trackback') { echo "Trackback"; }

    I tillegg har jeg valgt å legge til en overskrift mellom de to loopene for tilbakesporinger. Jeg ønsker ikke å vise denne overskriften dersom det ikke finnes tilbakesporinger. Koden jeg har brukt er lagt mellom de to loopene og ser slik ut: < ?php $pingbacksfound = false; ?> < ?php foreach ($comments as $comment) : ?> < ?php if (get_comment_type() != 'comment' && $pingbacksfound == false) { ?>

    Trackbacks/pingbacks

    < ?php $pingbacksfound = true; ?> < ?php } ?> < ?php endforeach; /* end for each comment */ ?>

    Det var det. Som nevnt finnes det helt sikkert mange måter å løse dette på. Har du løst dette på en annen eller bedre måte setter jeg pris en liten kommentar om det.

    Jeg har ikke veldig mange tilbakesporinger på denne bloggen, men du kan se et eksempel på hvordan det hele ser ut i innlegget Det Gode Liv.

    22 tanker om “Separere kommentarer og pingbacks i WordPress

    1. M@rqs

      Du og disse pingback greiene dine.

      Jeg får opp dine kommentartilbakevisegreiene inn i siste kommentarer hos meg igjen. Er dette noe du planlegger? Forstår egentlig ikke hva jeg snakker om, men ting du har kommentert hos meg for 1 år siden kommer opp igjen.

      Hehe.

    2. Kristin

      Tok en litt enklere variant av denne på det nyeste temaet jeg har lagt, med bare en loop, men med litt CSS stylig også kan skille kommentarer fra tilbaketråkk.

      Minner litt om systemet WP Matt bruker på sin blogg.

    3. XmasB Innleggsforfatter

      Jeg er ikke helt sikker på om jeg skjønte hva du mente nå nei, M@rqs. Kan hende jeg har pinget noe gammelt hos deg?

      Kristin, det hørtes egentlig ut som en penere variant. Lenken til WP Matt fungerer ikke.

    4. Kristin

      ..Det skal visst være .net ikke .org som jeg skrev. Han kalte seg ‘the .org guy’ en stund så jeg tok for gitt at hjemmesida var .org

      Uansett; i min versjon så får du bare opp f.eks. Pingpack : Link, denne har sin egen css klasse så man f.eks. gjøre den mindre fremtredende.

    5. Kristin

      Nei, det vil ikke legge det i egen liste, men den tar vekk sammendraget, som gjerne kan være litt forvirrende i forbindelse med diskusjon da det i blant ser ut som en ekte kommentar hvis man ikke passer på.

    6. XmasB Innleggsforfatter

      Ok, da er jeg med. Det er selvfølgelig en grei måte å gjøre det på. Jeg ønsket i tillegg å legge de i hver sin liste. Ulempen med min metode er nå at det loopes gjennom kommentarene hele tre ganger for hver gang. En for «rene» kommentarer, en for tilbakesporinger, og en for å sjekke om det skal være en overskrift. Jeg kan helt sikkert optimalisere dette litt, men har ikke brukt mer tid på det foreløpig.

    7. XmasB Innleggsforfatter

      Nettopp. Jeg har ikke sett noen bedre måter å gjøre dette på. Men det burde jo finnes… Tar gjerne imot forslag.

    8. Martin Bekkelund

      Jeg har fiklet med dette i kveld, uten å finne en tilfredsstillende løsning. Det eneste alternativet jeg ser for meg er å manuelt gå igjennom kommentartabellen to ganger for først å finne kommentarer, så trackbacks / pingbacks. Klarer ikke å se for meg at det er en god teknisk løsning, selv om jeg mistenker at det er slik «comments_number» fungerer, dog uten å dele det opp.

      Ideelt sett vil jeg splitte presentasjon av kommentarer og trackbacks / pingbacks. Først en overskrift med eksempelvis «11 kommentarer til artikkelnavn», hvor jeg lister kommentarene, så en ny overskrift med «3 trackback / pingback» til artikkelnavn», hvor jeg lister trackback / pingback til artikkelen.

      Et alternativ jeg har lekt med, er å sette en ny klasse på hvert listeelement, slik at kommentarer, trackbacks og pingbacks får egne klasser som jeg kan stilsette med CSS. Da vil det være lett å skille de visuelt.

      Jeg har også lekt med et annet alternativ, som er en variant av det første alternativet, hvor jeg gir brukeren mulighet til å vise eller skjule kommentarer og trackbacks / pingbacks etter eget ønske med noe fancy-smancy JavaScript. Vet dog ikke helt hvor brukervennlig det vil være.

    9. Kristin

      Martin: Mener det ligger en hack for det i sandbox temaet for å teller kommentarer og tilbaketråkk hver for seg, i tillegg til å skille dem fra hverandre.

      Jeg tror ikke Javascript løsningen vil bli så bra egentlig.

    10. Martin Bekkelund

      Supert, da skal jeg ta en titt på Sandbox. Jeg merker for øvrig at jeg trenger å skrive om temaet mitt fra bunnen av, da det er en del Template Tags som har gått ut på dato. Temaet jeg har i dag har jeg brukt helt siden versjon 1.ettellerannet.

    11. XmasB Innleggsforfatter

      Jeg vurderte å gå gjennom listen for å legge kommentarer i en liste og linkbacks i en annen. Da kunne jeg fint ordnet rekkefølge og overskrifter ut fra dette. Som dere ser hos meg viser jeg nå antall «responser» totalt sett, altså kommentarer og linkbacks til sammen. Det er ikke den beste løsningen, men den fungerer. Jeg tror neppe jeg gidder gjøre så mye mer med dette nå.

    12. XmasB Innleggsforfatter

      Det ser jo veldig bra, Martin. Jeg ville kanskje også fjernet teksten fra pingbacks, men noen ønsker kanskje å ha med den også. Hvordan har du kodet dette?

    13. Martin Bekkelund

      Det er nok en god idé å fjerne teksten fra pingback, ettersom de ikke inneholder utdrag av teksten i posten det pinges fra. Skal se om jeg finner en fiffig måte å designe dette på.

      Jeg tok tak i funksjonaliteten i Sandbox-temaet, slik Kristin foreslo, og klippet det til i mitt eget, hjemmesnekrede tema. Ser dog at det er en liten bug der fortsatt, slik at det alltid vises «Ett trackback / pingback» selv om det ikke er noen, men hvis det er kommentarer.

      Hvis det er av interesse deler jeg gjerne koden straks den blir bugfri. Alternativt kan jeg dele den og få hjelp til bugfiksing. 😛

    14. XmasB Innleggsforfatter

      Jeg har selv fjernet teksten fra pingbacks hos meg fordi jeg synes dette ble penest.

      Jeg vurderer nå endre videre på koden min, slik at antall kommentarer og pingbacks blir riktig. Skal ikke være så vanskelig å få til tror jeg. En liten hack her, en liten hack der…

    15. Martin Bekkelund

      Jeg har to ting på arbeidslista mi vedrørende denne saken:

      1. Vise nummerering av hver enkelt kommentar på en pen måte.
      2. Fikse den tidligere omtalte buggen.

      Det vanskeligste punktet tror jeg er det første, ettersom det er en nummerert liste hvor man ikke har frie tøyler til å endre utseendet på nummeret.

    16. XmasB Innleggsforfatter

      Du får si ifra når du har fått fikset det. Det høres ikke så ille ut, men jeg har jo ikke sett koden. Lykke til! 🙂

    17. Sissel

      Så flinke dere er. Den måten du har løst det på Martin, sånn vil jeg også ha det. Rent visuelt kunne jeg kanskje tenkt meg et mer markert skille (enten ved bruk av farger eller annet) mellom kommentarene og trackbacks/pingbacks, men at de legger seg for seg selv nederst er glimrende. Kan noen gi meg et lite pip når dette er ute? 🙂

    18. XmasB Innleggsforfatter

      Har ikke sett noen god ferdigløsning enda, Sissel. Praktisk alle løsninger på dette innebærer en del hacking i koden. Det beste er selvsagt om han/hun som lagde temaet tenkte på det til å begynne med.

    19. Tilbaketråkk: My own! My Preciousss! · Fru W

    Det er stengt for kommentarer.