it-swarm.com.de

Wie verwende ich return in meiner benutzerdefinierten Funktion anstelle von echo?

Ich erstelle eine Funktion in functions.php mit einem benutzerdefinierten Hook und nach dem, was ich irgendwo gelesen habe, es ist eine gute Praxis, Echo in einer WordPress-Funktion zu verwenden? Korrigiere mich, wenn ich falsch liege.

Wie auch immer, mit Echo funktioniert meine Funktion, bricht aber alles andere. Mit return gibt die Funktion nichts mehr aus, aber nichts ist kaputt. Ich habe versucht, diese Frage als Referenz zu verwenden, um meine zu beheben.

Folgendes habe ich:

function display_collections_menu(){
/* Get WooCommerce's product categories which is custom taxonomy */
  $prod_cat_args = array(
      'taxonomy'     => 'product_cat', //woocommerce
      'orderby'      => 'name',
      'empty'        => 0
    );

    $woo_categories = get_categories( $prod_cat_args );

    $woo_menu = '';

    $woo_menu.= '<ul class="menu-collections">';

    /* For each first level category, get the image, name, and link */
    foreach ( $woo_categories as $woo_cat ) {

        if( $woo_cat->category_parent == 0 ) {
          $woo_cat_id = $woo_cat->term_id; //category ID
          $woo_img_id = get_woocommerce_term_meta( $woo_cat_id, 'thumbnail_id', true ); //category image ID
          $woo_parent_image = wp_get_attachment_url( $woo_img_id ); //category image url
          $woo_cat_slug = $woo_cat->slug; //category slug for classes
          $woo_cat_name = $woo_cat->name; //category name for link

          /* return the image/link/name */
          $orw_woo_menu.= '<li class="menu-product menu-item menu-item-object-' . $woo_cat_slug . ' ">
          <a href="' . get_term_link( $woo_cat_slug, 'product_cat' ) . '" class="menu-product-link">
          <img src="' . $woo_parent_image . '" alt=" ' . $woo_cat_name . ' " class="menu-product-thumb" />
          <p class="menu-product-name">' . $woo_cat_name . '</p></a></li>';
        } 

    }//end of $woo_categories foreach

    $woo_menu.= '</ul>';

    return $woo_menu;   
}
add_action('woo_collections_menu', 'display_collections_menu');

Es funktioniert, wenn ich anstelle von return und einer Variablen nur die Werte wiedergebe, aber die Dinge kaputt gehen. Nutze ich return falsch?


Aktualisiert bei einem Versuch Privateers Lösung - funktioniert immer noch nicht:

function display_collections_menu( $input = '' ){
/* Get WooCommerce's product categories which is custom taxonomy */
  $prod_cat_args = array(
      'taxonomy'     => 'product_cat', //woocommerce
      'orderby'      => 'name',
      'empty'        => 0
    );

    $woo_categories = get_categories( $prod_cat_args );

    $woo_menu = '';

    $woo_menu.= '<ul class="menu-collections">';

    /* For each first level category, get the image, name, and link */
    foreach ( $woo_categories as $woo_cat ) {

        if( $woo_cat->category_parent == 0 ) {
          $woo_cat_id = $woo_cat->term_id; //category ID
          $woo_img_id = get_woocommerce_term_meta( $woo_cat_id, 'thumbnail_id', true ); //category image ID
          $woo_parent_image = wp_get_attachment_url( $woo_img_id ); //category image url
          $woo_cat_slug = $woo_cat->slug; //category slug for classes
          $woo_cat_name = $woo_cat->name; //category name for link

          /* return the image/link/name */
          $orw_woo_menu.= '<li class="menu-product menu-item menu-item-object-' . $woo_cat_slug . ' ">
          <a href="' . get_term_link( $woo_cat_slug, 'product_cat' ) . '" class="menu-product-link">
          <img src="' . $woo_parent_image . '" alt=" ' . $woo_cat_name . ' " class="menu-product-thumb" />
          <p class="menu-product-name">' . $woo_cat_name . '</p></a></li>';
        } 

    }//end of $woo_categories foreach

    $woo_menu.= '</ul>';

    return $woo_menu;   
}
add_filter('collections_menu', 'display_collections_menu', 10, 1);
$html_block = apply_filters('collections_menu', $input_html);

Und dann in einer Vorlage:

<?php echo $html_block; ?>

Mache ich das immer noch falsch?

1
RachieVee

Wenn Sie in der Vorlage do_action( 'woo_collections_menu' ); verwenden, muss Ihre Funktion ihren Wert wiedergeben. Andernfalls geben Sie return die Daten in ein Schwarzes Loch ein, nichts gibt aus, was Sie zurückgeben.

Wenn Sie einen Filter verwenden, sollten Sie den Wert return eingeben. Der Sinn eines Filters ist es, einen Wert zu nehmen, diesen Wert durch eine Funktion zu filtern und dann etwas mit dem Ergebnis zu tun. Im Kontext Ihrer Vorlage wäre die Verwendung von apply_filters etwas seltsam, da Ihr Menü erst dann einen Wert hat, wenn Sie es erstellen. In der Vorlage würde es also so aussehen:

echo apply_filters( 'collections_menu', '' );

Das ist nur potenziell verwirrend und unnötig. Diese leere Zeichenfolge könnte ein Standardmenü oder etwas anderes sein, aber das in die Vorlage einzufügen ist wahrscheinlich nicht die klügste Wahl.

Ein Filter würde jedoch innerhalb der Funktion selbst Sinn machen, damit jemand die Ausgabe ändern kann.

function display_collections_menu(){
    $default_menu = 'my complete menu markup here';
    return apply_filters( 'collections_menu', $default_menu );
}

Dann können Sie in der Vorlage einfach die Funktion direkt ausgeben:

echo display_collections_menu();

und jemand kann seinen eigenen Filter hinzufügen, um die Ausgabe zu ändern, wenn er möchte. Eine weitere hilfreiche Einbeziehung könnte ein Filter für die Argumente sein, mit denen Sie Begriffe abrufen, damit jemand die Menüausgabe ändern kann, ohne die gesamte Funktion reproduzieren zu müssen.

Es sollte jedoch auch funktionieren, zum ursprünglichen Code zurückzukehren, do_action( 'woo_collections_menu' ); hinzuzufügen und dann die Menüausgabe direkt in der Funktion wiederzugeben.

1
Milo

Nach meinem Verständnis von Aktionen (im Gegensatz zu Filtern) führt eine Aktion einfach etwas aus und stoppt die Verarbeitung. Es wird kein Rückgabewert verwendet.

Sie können Ihren Code in einen Filter ändern, indem Sie ein Argument akzeptieren (z. B. den HTML-Code, an den der Code angehängt werden soll) und dann einen Aufruf wie den folgenden ausführen, bei dem Sie den Code abrufen möchten:

$html_block = apply_filters('woo_collections_menu', $input_html);

Dazu können Sie Ihre Funktionsdefinition ändern:

function display_collections_menu( $input = '' ){
 #code here
}
add_filter('woo_collections_menu', 'display_collections_menu', 10, 1);

Das würde dann unsere Ausgabe in die Variable $html_block setzen, damit Sie sie verwenden können, wie Sie es für richtig halten.

1
Privateer

Ich konnte immer noch nicht herausfinden, wie ich zurückkehren soll $ woo_menu; mit meinem ersten Beispielcode, aber ich habe festgestellt, dass die Dinge nicht kaputt gehen, wenn ich den Rest der Struktur so weit wie möglich behalte und nur einmal ganz am Ende wiederhole. Das scheint bei mir zu funktionieren. Ob dies eine gute Praxis ist oder nicht, hinterlassen Sie mir einen Kommentar, aber für den Moment ist dies die Lösung, die ich verwende.

Vielen Dank.

function display_collections_menu(){
/* Get WooCommerce's product categories which is custom taxonomy */
  $prod_cat_args = array(
      'taxonomy'     => 'product_cat', //woocommerce
      'orderby'      => 'name',
      'empty'        => 0
    );

    $woo_categories = get_categories( $prod_cat_args );

    $woo_menu = '';

    $woo_menu.= '<ul class="menu-collections">';

    /* For each first level category, get the image, name, and link */
    foreach ( $woo_categories as $woo_cat ) {

        if( $woo_cat->category_parent == 0 ) {
          $woo_cat_id = $woo_cat->term_id; //category ID
          $woo_img_id = get_woocommerce_term_meta( $woo_cat_id, 'thumbnail_id', true ); //category image ID
          $woo_parent_image = wp_get_attachment_url( $woo_img_id ); //category image url
          $woo_cat_slug = $woo_cat->slug; //category slug for classes
          $woo_cat_name = $woo_cat->name; //category name for link

          /* return the image/link/name */
          $orw_woo_menu.= '<li class="menu-product menu-item menu-item-object-' . $woo_cat_slug . ' ">
          <a href="' . get_term_link( $woo_cat_slug, 'product_cat' ) . '" class="menu-product-link">
          <img src="' . $woo_parent_image . '" alt=" ' . $woo_cat_name . ' " class="menu-product-thumb" />
          <p class="menu-product-name">' . $woo_cat_name . '</p></a></li>';
        } 

    }//end of $woo_categories foreach

    $woo_menu.= '</ul>';

    echo $woo_menu; //ECHO at the very end instead of return works for me  
}
add_action('woo_collections_menu', 'display_collections_menu');
0
RachieVee