in jeder Kategorienansicht einen statischen Text – sticky post für die Archive

Statischen Text für die jeweilige Kategorie – sticky post für die Kategorie. Nach so etwas fragte mich ad_prof . Grund: Er mag in jeder Kategorie einen längeren Beschreibungstext für die Benutzer anbieten. Nutzt aber die Kategorienbeschreibung bereits für die meta_description im Header und sucht natürlich nach einer Lösung, die nicht ständiges Eingreifen in die Templates von WordPress erfordert. Ruft man in seinem SEO-Blog eine Kategorie auf, ist der zuletzt geschriebene Beitrag ganz oben – so wie es eben Standard ist.

Meine Lösung hat 3 Schritte:

  1. 1. Die vorhanden archive.php sichern.
  2. 2. Die archive.php öffnen und dann untenstehenden Code einfügen.
    Wie immer:ich weiß nicht, ob copy and paste funktioniert!
  3. 3. Admincenter==>Beitrag schreiben==>richtige Kategorie anhaken==>Zeitstempel ändern!
    Von mir aus auf den 1.August 1877 – speichern. Fertig!.

Zeitstempel auf ein sehr frühes Datum ändern ist absolut wichtig, sonst kann dies nicht funktionieren!

Die archive.php ist gesichert, mit einem Editor geöffnet und nun gehts los:

Beispiel anhand der archive.php aus dem default Theme.


<?php get_header(); ?>

<div id="content" class="narrowcolumn">

<!--stickypost beginn-->

<?php $my_query = new WP_Query($query_string."&showposts=1&order=ASC");
while ($my_query->have_posts()) : $my_query->the_post();
$do_not_duplicate = $post->ID;?>


<div class="stickypost">
   <h2 id="post-<?php the_ID(); ?>">
   <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
   <?php the_title(); ?></a>
   </h2>
 <?php the_content(); ?>
 </div><!--stickypost end-->
<?php endwhile; ?>



<!--stickypost end-->

<?php if (have_posts()) : ?>

 <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>

Was bedeutet dies alles:

Vor dem Loop nutze ich die Möglichkeit des query_strings. Ich befehle WordPress mit

$query_string."&showposts=1&order=ASC"

Hole aus der Kategorie ein einziges Post und zwar in aufsteigender Reihenfolge.

Darum ist auch das Zeitstempel ändern beim Beitrag schreiben so wichtig. WP holt das älteste Post aus dieser Kategorie hervor. ;)

Dann bestimme ich noch, dass dieses Post ein sogenanntes Duplicate Post ist, weil niemand mag, dass dieser Beitrag in der normalen Kategorie noch einmal angezeigt wird.

Weil dies niemand mag, gehts noch ein bisschen weiter in der archive.php. Irgendwann taucht dort auf:


<?php while (have_posts()) : the_post();?>

Dort brauchen wir jetzt unser Duplicate Post, damit es ja nicht angezeigt wird, das geht so:


<?php while (have_posts()) : the_post(); 
if( $post->ID == $do_not_duplicate ) continue;

  update_post_caches($posts); ?>

Aber die Katgorienüberschrift..

Beim default Theme wäre jetzt die Kategorienüberschrift unterhalb dieses sticky Posts.

Dies erachte ich als weniger sinnvoll, daher habe ich sie einfach nach oben geholt und dort wo sie sonst steht gelöscht.

Hier die gesamte archiv.php des default Themes nach diesen Änderungen, die ich gekennzeichnet habe, damit sie leichter gefunden werden:

<!--stickypost beginn-->
und dann wenn die &#196;nderung aus ist

<!--stickypost end-->

<?php get_header(); ?>

<div id="content" class="narrowcolumn">

<!--stickypost beginn-->

<?php $my_query = new WP_Query($query_string."&showposts=1&order=ASC");
while ($my_query->have_posts()) : $my_query->the_post();
$do_not_duplicate = $post->ID;?>

<h2>
<?php _e('Category'); ?>: <?php single_cat_title(); ?>
</h2>

<div class="stickypost">
<h2 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
<?php the_title(); ?></a>
</h2>
 <?php the_content(); ?>
 </div><!--stickypost end-->
<?php endwhile; ?>



<!--stickypost end-->

<?php if (have_posts()) : ?>

 <?php $post = $posts[0]; // Hack. Set $post so that the_date() works. ?>
<!--stickypost beginn da war mal die Katueberschrift-->

<!--stickypost end-->

   <?php /* If this is a daily archive */ 
   } elseif (is_day()) { ?>
<h2 class="pagetitle">Archive for <?php the_time('F jS, Y'); ?>
</h2>

 <?php /* If this is a monthly archive */ 
 } elseif (is_month()) { ?>
<h2 class="pagetitle">Archive for <?php the_time('F, Y'); ?>
</h2>

<?php /* If this is a yearly archive */ 
} elseif (is_year()) { ?>
<h2 class="pagetitle">Archive for <?php the_time('Y'); ?>
</h2>

  <?php /* If this is a search */ 
  } elseif (is_search()) { ?>
<h2 class="pagetitle">Search Results</h2>

  <?php /* If this is an author archive */ 
  } elseif (is_author()) { ?>
<h2 class="pagetitle">Author Archive</h2>

<?php /* If this is a paged archive */ 
} elseif (isset($_GET['paged']) && !empty($_GET['paged'])) { ?>
<h2 class="pagetitle">Blog Archives</h2>

<?php } ?>


<div class="navigation">
<div class="alignleft">
<?php next_posts_link('&laquo; Previous Entries') ?>
</div>
<div class="alignright">
<?php previous_posts_link('Next Entries &raquo;') ?>
</div>
</div>

<!--stickypost beginn-->
<?php while (have_posts()) : the_post(); 
   if( $post->ID == $do_not_duplicate ) continue;
   update_post_caches($posts); ?>
<!--stickypost end-->
  
<div class="post">
<h3 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
<?php the_title(); ?></a></h3>
<small><?php the_time('l, F jS, Y') ?></small>

<div class="entry">
<?php the_content() ?>
</div>

<p class="postmetadata">
Posted in <?php the_category(', ') ?> | 
<?php edit_post_link('Edit', '', ' | '); ?>  
<?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p> 

</div>

<?php endwhile; ?>

<div class="navigation">
<div class="alignleft">
<?php next_posts_link('&laquo; Previous Entries') ?>
</div>
<div class="alignright">
<?php previous_posts_link('Next Entries &raquo;') ?>
</div>
</div>

<?php else : ?>

<h2 class="center">Not Found</h2>
<?php include (TEMPLATEPATH . '/searchform.php'); ?>

<?php endif; ?>

</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

Ich habe es getestet und es funktionierte.

Den Zeitstempeln jeweils zu ändern, dacht ich mir ist die geringste Arbeit, wenn man sich dafür ‚ewigste‘ Eingriffe in die Templates erspart, weil man weiß ja nie wieviele Kategorien man erstellt.

… sowas zu machen, dann auf den Refresh Button des Browsers zu klicken – funktionierts oder nicht?!? – das hat was ;)
16

16 Beiträge zu “in jeder Kategorienansicht einen statischen Text – sticky post für die Archive

  1. Kommentar Autor
    ad_prof
    Kommentar

    Juhee!!!
    es funzt. ein erneutes hoch auf texto!!!!!

    hab das hier direkt mal umgesetzt.

    das einzige was jetzt noch „suboptimal“ ist, ist das der „statische beitrag“ verlinkt ist. aber so wild ist das auch nicht.

    als dankeschön setzte ich doch direkt mal nen link. sag mir einfach wohin und mit welchem linktext. nur von meinem seo blog geht das net (stichwort reziproke verlinkung)..

    muchos gracias

    ad_prof

  2. Kommentar Autor
    Monika
    Kommentar

    Hallo ad_prof

    aus unerfindlichen Gründen landete dieser obige Kommentar von Dir in der absoluten Blacklist :( :(
    beim Retten habe ich den Zeitstempel irrtümlich vertan – tut mir leid.

    Das Verlinken ist leicht änderbar…;)

    ändere dies:

    
    <div class="post">
    
    <h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h3>
    

    auf:

    <div class="post">
    
    <h3 id="post-<?php the_ID(); ?>"><?php the_title(); ?></h3>
    
    

    Somit müßte nur der Titel erscheinen und kein Link mehr.

    Wegen des Links sag ich Danke :-)und melde mich bei Dir per Email.

    lg

  3. Kommentar Autor
    Raimund
    Kommentar

    Hallo,
    ich hänge hier zeitlich ziemlich hinterher und sonst in der Luft :-(. Ich bitte um Nachsicht, wenn ich etwas länger ausführe, warum ich _hier_ kommentiere.

    Ich möchte die Website meines Handball-Vereins in WP umsetzen. Die diversen Mannschaften sind als Kategorien umgesetzt. Jeder dieser Kategorien soll eine informierende, immer gültige Einleitung/Info (welche Jahrgänge, wann ist Training etc.) voran gestellt sein.

    Das könnte mit category-templates umgesetzt werden, birgt aber 2 Haken:
    1.: Geht nur, wenn in der Kategorie auch mindestens ein Post geschrieben wurde – was *anfangs* nicht gegeben ist und bei z.B. den „Alten Herren“ sich auch nicht ändern wird.
    2.: ich müsste an die 20 spezifische category-templates anlegen.

    *Hier* kommt dein Ansatz ins Spiel und auf den Kategorie-Seiten klappt es auch. *ABER* es gibt dann ‚Nebenwirkungen‘, die ich nicht haben möchte:
    1.: Im Archiv erscheint der Monat für den ‚künstlich‘ frühen time-stamp, entsprechend würde er wohl auch im Kategorien-Archiv auftauchen.
    2.: Der Post erscheint ebenso auf der Blog-Haupt-Seite und
    3.: In der Liste „Letzte Beiträge“, die ja zumindest anfangs auch ‚übersichtlich‘ ist.
    Habe ich mich verständlich ausgedrückt? Gibt es Wege, den ’sticky‘ Post *nur* auf der jeweiligen Kategorie-Seite erscheinen zu lassen und *sonst* nirgends – auch nicht als Link – einzubinden?

    Ich suche jetzt schon einen halben Tag nach *irgend* welchen Möglichkeiten, das umzusetzen, was ich brauche, habe aber bisher *nichts* gefunden – insofern bin ich auch für weiterführende Tipps *sehr* dankbar!

    Ergänzend: Ich arbeite noch auf einer lokalen WP-Installation und kann daher nicht mit ‚Arbeits-Links‘ dienen.

    Besten Dank für die Geduld beim Lesen und eventuelle Tipps

    Raimund

  4. Kommentar Autor
    Monika
    Kommentar

    Hi
    mache die Kategory *forever*

    die schließt Du von jeder Anzeige aus. Gut vielleicht irgendwo im Archiv, aber das macht dann wirklich nichts -oder ?

    In diese Kategory forever tippst Du pro Kategorie all das was getippt werden sollte.

    verwende aber nicht den More link bitte ;)

    Die hat die ID 100

    zwischen

    <?php /* If this is a category */ if (is_category()) { ?>
     hier dazwischen 
    <?php } ?>
    
    

    machst du jetzt für jede der Kategorien folgende Abfrage:

    <?php /* If this is a category */ if (is_category()) { ?>
    
    <?php /* If this is a category */ if (is_category('aeltere')) { ?>
    <?php
    $posts = get_posts('category=100&numberposts=1');
    foreach($posts as $post) :
    setup_postdata($post);
    ?>
    alles was Du anzeigen magst, title the_content etc...
    <?php endforeach; ?>
    <?php } ?>
    <?php /* If this is a category */ if (is_category('jahrgang90')) { ?>
    <?php
    $posts = get_posts('category=100&numberposts=1&offset=1');
    foreach($posts as $post) :
    setup_postdata($post);
    ?>
    alles was Du anzeigen magst, title the_content etc...
    <?php endforeach; ?>
    <?php } ?>
    
    
    <?php
    $posts = get_posts('category=100&numberposts=1&offset=2');
    foreach($posts as $post) :
    setup_postdata($post);
    ?>
    alles was Du anzeigen magst, title the_content etc...
    <?php endforeach; ?>
    <?php } ?>
    
    <?php } ?>
    

    mit offset erzwingst Du , dass zb nur der 3te Artikel der Kat forever mit der ID 100 angezeigt wird,
    es müßte klappen

    lg

  5. Kommentar Autor
    Raimund
    Kommentar

    Hallo,
    nach ein paar Tagen kann ich nun reagieren.

    Vielen Dank für deine Mühe! Paralell zu meiner Anfrage hier fand ich ein Plugin, das mir den Job auch zu schaffen scheint. Eine Weile funktionierte es nicht wie gedacht, das lag aber an meinem Template :-(. So lernte ich auch gleich das Support-Forum kennen ;-).

    Da mir das Plugin als recht lohnend für diese Aufgabe erscheint, würde ich dir hier die URL posten, geht aber nicht. Es heißt „WP-Sticky“ – man findet es unter:
    (3xw).lesterchan.net/wordpress/category/plugins/wp-sticky/

    Schau es dir mal an und vielleicht ist es dir einen Tipp-Artikel in deiner super Linksammlung wert?

    Noch mal vielen Dank, mit besten Grüßen

    Raimund

  6. Kommentar Autor
    Mic
    Kommentar

    Super klasse, genau danach habe ich gerade gesucht …vielen Dank dafür ;-)

  7. Kommentar Autor
    Ingo
    Kommentar

    Gibt es auch eine Möglichkeit das nur einer bestimmten Kategorie zuzuweisen? Ich brauche das nur bei einer einzigen Kategorie.

  8. Kommentar Autor
    Monika
    Kommentar

    ja Ingo;)

    Admincenter==>Verwaltung==>Kategorien
    da findest du die ID der Kategorie, der Du das zuweisen magst,
    dann öffnest Du das derzeitige category.php Template und speicherst es als category-12.php ab, wenn die Kategorie die ID 12 hat;)

    dann nur in dieses Template obigen Code und fertig

    alles gute
    lg

  9. Kommentar Autor
    albandi
    Kommentar

    Unter wp 2.5 erhalte ich einen Parse error (syntax error, unexpected ‚}‘) in der archive.php.
    Muss das nicht wie folgt lauten?
    „“

    Albandi

  10. Kommentar Autor
    Monika
    Kommentar

    Hi albandi

    code geht hier nicht aus Sicherheitsgründen, das darf nur ich,
    an und für sich wäre es egal , ob WP 2.5 oder WP 2.3. da dürfte kein Syntaxerror sein,

    wenn es immer noch nicht geht, sende mir den Code in einer Textdatei mit dem Formular,
    bloß ein wenig Geduld,weil ich soviele Anfragen unterschiedlichster Art habe, dass ich manchmal lange brauche bis ich alle durch habe

    lg

  11. Kommentar Autor
    alibandito
    Kommentar

    Gibt es eine Möglichkeit, Keywords von dem stickypost für die Kategorie zu übernehmen?

  12. Kommentar Autor
    Monika
    Kommentar

    alibandito
    da müßtest du die derzeit vielen SEO Plugins mal testen,

    lg

  13. Kommentar Autor
    KinoFilmTrailer
    Kommentar

    Super, hab schon ewig danach gesucht, klappt wunderbar in meinem Kinoblog!

  14. Ping Einleitungstext auf Kategorieseiten – Variante 2 | Pommerencke.info