WordPress: Einfügen einer if-else-Anweisung in die Parameter next_post_link() / previous_post_link()?

Lesezeit: 7 Minuten

Benutzer-Avatar
Will Phillips

Erste Frage hier, obwohl das Lesen und Suchen meinen Speck einige Male gerettet hat.

Ich bin ein PHP-Hack bestenfalls, und ein WordPress-Theme, das ich baue, zwingt mich, viel zu lernen.

Ich bin auf ein Problem gestoßen, als ich versuchte, die Formate der nächsten und vorherigen Links basierend auf ihren jeweiligen Kategorien (und nicht auf der Seite der single.php) unterschiedlich anzuzeigen.

Hier mein bisher bester Versuch:

<?php next_post_link(
    '%link',
    if ( in_category( 'tweet' ) ) {
        get_the_content()
    } else {
        echo '%title'
    };,
    FALSE 
)?>

Dies führt zu einem Syntaxfehler.

Meine erste Frage ist kann ich sogar eine if-else-Anweisung innerhalb der Parameter einer Funktion verwenden?

Wenn ich komplett falsch an die Sache herangehe, dann geht es zurück ans Reißbrett. Dann freue ich mich auch über Alternativvorschläge!

Ich kenne folgende Arbeiten:

next_post_link( '%link', get_the_title(), FALSE );
next_post_link( '%link', '%title', FALSE );

Um zu versuchen, klarer zu sein, versuche ich, die Ausgabe der nächsten/vorherigen Links basierend auf der Kategorie der Links selbst und nicht auf der aktuellen Hostseite, auf der sie sich befinden, zu beeinflussen.

Das Problem, das ich habe, ist a) wie zu bestimmen, welche Kategorie die next_post_link() und previous_post_link() sind, und dann b) ihre anzeigen Link Parameter entsprechend. Wenn ich die weiße Fahne hochziehen darf, die Beispiele, die ich gefunden habe, verwenden get_adjacent_post() und verschiedene Arrays und dergleichen scheinen mir an dieser Stelle weit über den Kopf zu gehen. Ich würde wirklich jemanden schätzen, der mich durch alle Lösungen führt, die sie verwenden.

Benutzer-Avatar
hakre

Was soll angestrebt werden?

Ich denke, Sie mischen etwas zu viel, was Ihr Problem komplizierter macht, als es sein muss. Ich weiß, dass dies bei vielen neuen Dingen ziemlich leicht passieren kann, daher denke ich, dass es sich lohnt, einige Gedanken darüber zu verschwenden, was zu tun ist, bevor man mit dem Programmieren beginnt. Es soll am Ende helfen.

Beginnen Sie zu formulieren, was Sie erreichen wollen. Wenn ich Sie richtig verstehe, schreiben Sie, dass Sie die nächsten und vorherigen Links unter dem aktuellen Beitrag je nach Kategorie unterschiedlich anzeigen möchten.

Aber welche Kategorie? Der von der aktuelle Beitrag das zeigt? Oder die Kategorie der vorheriger/nächster verlinkter Beitrag?

Daneben können Beiträge stehen mehrere Kategorien. Möchten Sie die Anzeige basierend auf einer oder mehreren oder sogar allen Kategorien ändern?

Und zum Schluss: Wollen Sie tonnenweise ausgeben HTML-Tags für das optische Styling? Oder möchten Sie verwenden CSS dafür.

Wie es geht?

Nachdem Sie darüber nachgedacht haben was was du wirklich erreichen willst, kannst du dir ausdenken wie das kann gemacht werden.

Im Folgenden zeige ich einen Beispielcode, der Folgendes tut:

  • Erklärt die Verwendung von Link-Format Parameter, den Sie ändern möchten.
  • Zeigt, wie man die CSS-Klassen für die betreffenden Links erhält.
  • Erweitert die Ausgabe eines Themes um diese CSS-Klassen.
  • Machen Sie es für verschiedene Dateien innerhalb Ihres Designs wiederverwendbar.

Dieses Beispiel deckt also die Kategorien der verlinkten Posts für das visuelle Styling über das CSS Ihres Themes ab, was meiner Meinung nach der bevorzugte Weg ist.

Der PHP-Code

PHP ist ziemlich flexibel, also ist es am Ende einfach, das zu erledigen, aber ohne zu wissen, was genau zu tun ist, kann sich diese Flexibilität in PHP als Problem herausstellen, da es auch möglich ist, die Spur zu verlieren und dann etwas zu programmieren, das nicht funktioniert.

Sagen wir einfach, Sie möchten nur die ändern Link-Format für die next_post_link() Funktion.

Die Funktion ersetzt %link mit dem HTML-Link-Tag (<a href=...>Post Title</a>), also wenn du nimmst 'This is the next post of my blog: %link; waiting to be read!' Als Parameter haben Sie Text um den Link herum hinzugefügt.

<?php
  $format="This is the next post of my blog: %link; waiting to be read!";
  next_post_link($format);
?>

Sie können zusätzlich auch HTML-Tags darum herum hinzufügen:

<?php
  $format="<span style="font-size:2em">%link</span>";
  next_post_link($format);
?>

Dadurch haben alle nächsten Post-Links das Doppelte ihrer Standardschriftgröße.

Um dies jetzt etwas einfacher für das Thema zu machen, wäre es am besten, CSS-Klassen der Kategorie(n) hinzuzufügen, dann können Sie die Anzeige einfach innerhalb des CSS ändern.

<?php
  $inSameCategory = true; // depends on what you want, can be false as well
  $nextPost = get_adjacent_post($inSameCategory, '', false);
  $cssClasses = get_post_class('next-post-link ', $nextPost);
  $format = sprintf('<span class="$s>%link</span>', $cssClasses);
  next_post_link($format);    
?>

Dadurch wird der nächste Post-Link in a umbrochen <span> enthält alle CSS-Klassen des verlinkten Beitrags plus a next-post-link Klasse, falls Sie diese für den CSS-Selektor benötigen, um die Links zu stylen. Hier einige Beispiel-CSS:

.next-post-link.category-tweet {font-size: 2em;}

Wiederverwendbar machen

Da Sie einen Weiter- und einen Zurück-Link haben, können Sie diesen Code nur zum Ändern eines Parameters kopieren. Aber wir sind faul und packen es stattdessen in eine eigene Funktion:

  /**
   * my theme's format string for prev|next_post_link()
   *
   * @param bool $previous (optional) previous (true, default) or next (false) post
   * @param bool $inSameCategory (optional) use same category, default: true
   * @return string
   */
  function my_prev_next_link_format($previous = true, $inSameCategory = true) {
    $postId = get_adjacent_post($inSameCategory, '', $previous);
    $cssClasses = get_post_class('next-post-link ', $nextPost);
    $format = sprintf('<span class="$s>%link</span>', $cssClasses);
    return $format;
  }

Platzieren Sie diese Funktion in Ihrem Thema functions.php. Es ist dann in allen Ihren Vorlagen verfügbar. Die Verwendung wird jetzt sehr einfach:

<?php prev_post_link(my_prev_next_link_format()); ?>
...
<?php next_post_link(my_prev_next_link_format(false)); ?>

Wenn Sie dies alles zusammengestellt haben, können Sie die Weiter- und Zurück-Links einfach im CSS Ihres Themas gestalten.

  • Das ist eine ziemlich ausführliche Antwort; Ich schätze es sehr. Ich werde mich für die Nacht melden und es morgen früh ausprobieren. Die Arbeit innerhalb von functions.php ist genau die Art von PHP-Heavy-Lifting, die ich bisher nur zögerlich versucht habe … Nur zwei Cent ganz schnell, aber ich denke, es ist heutzutage die beste Praxis, die Inline-Stile zu vermeiden, wenn es überhaupt praktikabel ist. ..

    – Will Phillips

    18. Juni 2011 um 10:29 Uhr


  • Sie können immer noch Code für beide Links kopieren und einfügen, aber ich denke, das macht die Sache komplizierter, als ihn einmal und einfachen Zugriff in der functions.php zu haben. An Ort und Stelle zum Bearbeiten und Debuggen statt vieler. Gute Nacht.

    – hakre

    18. Juni 2011 um 10:32 Uhr


Hast du es versucht Anonyme Funktionen? Auf diese Weise können Sie if-else-Anweisungen innerhalb einer Funktion verwenden

Benutzer-Avatar
Fragesteller

Versuchen:

$format_string = in_category('tweet') ? 
'<span style="color:red;">%link</span>' : '%link';

next_post_link($format_string);

Der zweite und der dritte Parameter sind optional und standardmäßig auf title und false gesetzt.

Bearbeiten:

Ich kenne dieses Plugin nicht, aber…

if(in_category('tweet')){
$format_string = '<span style="color:red;">%link</span>';
$link_text = get_the_content();
}else{
$format_string = '%link';
$link_text="%title";  
}

next_post_link($format_string, $link_text);

  • Nun, das Problem ist, dass ich den Titel nicht für die Kategorie „Tweet“ verwenden möchte (das von mir verwendete Plugin automatisiert bestimmte Tweets in WordPress – die generierten Titel sind nicht benutzerfreundlich, daher wird get_the_content verwendet).

    – Will Phillips

    18. Juni 2011 um 9:51 Uhr

  • Kann ich also den zweiten Vorschlag in die functions.php einfügen? Weil es einfach in die single.php-Vorlage eingefügt wird, wird der $link_text von der Kategorie der Seite und nicht von den Links bestimmt. Probiere es vielleicht mal aus und schaue was passiert.

    – Will Phillips

    18. Juni 2011 um 18:50 Uhr

  • Es scheint nach dem, was Sie sagen, dass das Setzen von FALSE für das 3. Argument dieses next_post_link() in Ihrem Code nicht wie erwartet funktioniert? Betrachte nur die Dokumentation Es gibt einen optionalen vierten Parameter, wenn Sie genau angeben möchten, welche Kategorien enthalten/nicht enthalten sind: Excluded_categories: (String) Numerische Kategorie-ID(s), von denen der nächste Beitrag nicht gelistet werden soll. Trennen Sie mehrere Kategorien mit und; Beispiel: ‘1 und 5 und 15’. Um also die aktuelle Kategorie auszuschließen, übergeben Sie einfach ihre categoryID als vierten Parameter.

    – Fragesteller

    19. Juni 2011 um 10:15 Uhr

  • Was die Frage betrifft, ob alles in die functions.php eingefügt werden soll, würde ich sagen, dass es am besten ist, einfach alles zu bekommen, was auf der aktuellen Seite funktioniert, bevor Sie es in eine Funktion umwandeln. Höchstwahrscheinlich sollten es nicht mehr als ein paar Codezeilen sein, die Sie benötigen, da Sie nur bereits vorhandene Funktionen finden und implementieren müssen.

    – Fragesteller

    19. Juni 2011 um 10:20 Uhr

1368410cookie-checkWordPress: Einfügen einer if-else-Anweisung in die Parameter next_post_link() / previous_post_link()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy