it-swarm.com.de

Das Testen des Posttitels in der Anweisung 'if/else' gibt keinen Inhalt zurück

Ich teste für einen bestimmten festen Post auf einer About-Seite. Ich schätze, der beste Weg ist, den Post-Titel zu testen (?).

Hier ist mein Code, was läuft falsch?

<?php
if (is_page()) {
  $cat=get_cat_ID($post->post_title);
  $posts = get_posts ("cat=$cat&showposts=35");

  if ($posts) {
    foreach ($posts as $post):
      setup_postdata($post); ?>
        <div class="clear"></div>
            <h3><?php the_title(); ?></h3>
        <div class="clear"></div>

<?php    if ($post->post_title('skillset')) {
            echo '<div class="content">';
                the_content('');
            echo '</div>'; 
    }
        else{
        the_content('');
        }
                endforeach;
  }
}
?>
2
Max Chandler

Zunächst einmal ist $post eine der globalen Variablen des WordPress-Kerns und sollte daher entweder nicht berührt oder nach Ihrem foreachzurückgesetzt werden Schleife.

Wenn Sie setup_postdata() verwenden, können Sie Template-Tags verwenden, wie Sie dies im obigen Snippet mit the_title() tun. Es oder die Schleife, in der es verwendet wird, sollte jedoch immer von seinem Begleiter gefolgt werden wp_reset_postdata() .

Auch $post ist ein Objekt . Objekte sind Instanzen von Klassen, die Eigenschaften und/oder Methoden enthalten, die OOP Äquivalente von Variablen und Funktionen.

Indem Sie versuchen, den Post-Titel so zu testen, wie Sie es getan haben,

if($post->post_title('skillset'))

sie haben post_title so behandelt, als wäre es eine Methode, und Sie könnten den betreffenden Titel als Argument eingeben und einen Booleschen Wert zurückgeben. Es ist jedoch eine Eigenschaft und enthält als solche einen Wert, auf den Sie zugreifen können - und das ist es.

Dieser Wert muss dann gegen einen anderen Wert getestet werden. Daher

if( 'skillset' === $post->post_title ) {
    // your conditional operation
}

wäre ein arbeitstest für den titel.

Im Wesentlichen ist diese Zeile die Antwort auf die Frage in Ihrem Titel. Da Sie jedoch gefragt haben, was möglicherweise mit Ihrem Code nicht stimmt, ist auch das Argument showpostsfür eine Weile veraltet. Verwenden Sie stattdessen numberpostsname__.

Lassen Sie uns auch den ersten Punkt zur Verwendung von $post noch einmal betrachten. Wenn Sie anstelle der Vorlagen-Tags direkt auf die Eigenschaften verweisen würden, müsste der globale $post nicht überschrieben werden.

$wpse67413_posts = get_posts();

foreach( $wpse67413_posts as $wpse67413_post ) {
     echo '<h3>' . $wpse67413_post->post_title . '</h3>';
}

Würde genauso gut funktionieren, ohne das Globale zu berühren. Das nur der Vollständigkeit halber.

Und als Randnotiz, warum würden Sie so viele PHP-Öffnungs- und Schließ-Tags auf so wenig Raum verwenden? So ziemlich eine rhetorische Frage: Es macht einfach keinen Sinn.

Bist du dir endlich sicher, dass du das machen willst:

$cat=get_cat_ID($post->post_title);

? Dies ist nur dann sinnvoll, wenn Sie Beiträge einer Kategorie abrufen möchten, deren Name genau dem Titel der Seite entspricht, auf der sich der Besucher befindet. Angenommen, die Antwort ist positiv. Hier ist die vollständige Korrektur Ihres obigen Ausschnitts:

global $post;

if( is_page() ) {
    $wpse67413_posts = get_posts( array(
        cat => get_cat_ID($post->post_title),
        numberposts => 35
    ));

    if( $wpse67413_posts ) {
        foreach ( $wpse67413_posts as $post ) {
            setup_postdata($post);

            echo '<div class="clear"></div>' .
                '<h3>' get_the_title() . '</h3>' .
                '<div class="clear"></div>';

            if( 'skillset' === $post->post_title ) {
                echo '<div class="content">' . get_the_content() . '</div>'; 
            } else {
                the_content();
            }
        }
    }

    wp_reset_postdata();
}
2
Johannes Pille

Der beste Weg wäre, nach einem Ausweis zu suchen, nicht nach einem Titel! Dann wäre dein wenn:

if ($post->ID === 123)

dabei ist 123 die ID des Posts, den Sie "filtern" möchten.

0
Miha Rekar