2 Funktionen beißen sich...

unwohltaeter

Mitglied
Keine Ahnung ob das jetzt eher hierher gehört oder in ein anderes Forum.

Ich habe zwei Funktionen (Wordpress-Shortcodes) die sich scheinbar irgendwie/-wo ins Gehege kommen, kann aber den Fehler nicht finden.

Die erste Funktion:
PHP:
function fuenf_rezepte() { ?>
<ul>
<?php global $post;
	$arguments = array( 'numberposts' => 5, 'orderby' => 'rand', 'meta_key' => 'Produkt', 'meta_value' => $post->post_title );
	$my_query = get_posts($arguments);
	$link = get_permalink();
	foreach($my_query as $post) :
		setup_postdata($post); ?>
		<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
	<?php endforeach; ?>
</ul>
<?php }

add_shortcode('fuenfrezepte', 'fuenf_rezepte');

Die zweite Funktion:
PHP:
function produktinformation() { 
global $post;

$brennwert1 =  get_post_meta($post->ID, 'Brennwert (pro 100g)', true);
$brennwert2 = get_post_meta($post->ID, 'Brennwert (pro Portion)', true);
$eiweiß1 = get_post_meta($post->ID, 'Eiweiß (pro 100g)', true);
$eiweiß2 =  get_post_meta($post->ID, 'Eiweiß (pro Portion)', true);
$kohlenhydrate1 = get_post_meta($post->ID, 'Kohlenhydrate (pro 100g)', true);
$kohlenhydrate2 = get_post_meta($post->ID, 'Kohlenhydrate (pro Portion)', true);
$zucker1 = get_post_meta($post->ID, 'Zucker (pro 100g)', true);
$zucker2 = get_post_meta($post->ID, 'Zucker (pro Portion)', true);
$fett1 = get_post_meta($post->ID, 'Fett (pro 100g)', true);
$fett2 = get_post_meta($post->ID, 'Fett (pro Portion)', true);
$fettsaeuren1 = get_post_meta($post->ID, 'gesätt. Fettsäuren (pro 100g)', true);
$fettsaeuren2 = get_post_meta($post->ID, 'gesätt. Fettsäuren (pro Portion)', true);
$ballaststoffe1 = get_post_meta($post->ID, 'Ballaststoffe (pro 100g)', true);
$ballaststoffe2 = get_post_meta($post->ID, 'Ballaststoffe (pro Portion)', true);
$natrium1 = get_post_meta($post->ID, 'Natrium (pro 100g)', true);
$natrium2 = get_post_meta($post->ID, 'Natrium (pro Portion)', true);

return '
<div class="produktinfo_ungerade produktinfo_kopf">bei Zubereitung lt. Anleitung</div>
<div class="produktinfo_ungerade produktinfo_ueberschrifteins">N&auml;hrwerte</div>	
<div class="produktinfo_ungerade produktinfo_ueberschriftzwei">pro 100g</div>	
<div class="produktinfo_ungerade produktinfo_ueberschriftdrei">pro Portion</div>	
<div class="produktinfo_spalteeins_hoch">Brennwert</div>	
<div class="produktinfo_spaltezwei_hoch">' . $brennwert1 .'</div>
<div class="produktinfo_spaltedrei_hoch">' . $brennwert2 . '</div>	
<div class="produktinfo_ungerade produktinfo_spalteeins">Eiweiß</div>	
<div class="produktinfo_ungerade produktinfo_spaltezwei">' . $eiweiß1 . '</div>	
<div class="produktinfo_ungerade produktinfo_spaltedrei">' . $eiweiß2 . '</div>	
<div class="produktinfo_spalteeins">Kohlenhydrate</div>	
<div class="produktinfo_spaltezwei">' . $kohlenhydrate1 . '</div>	
<div class="produktinfo_spaltedrei">' . $kohlenhydrate2 . '</div>	
<div class="produktinfo_ungerade produktinfo_spalteeins">- Zucker</div>	
<div class="produktinfo_ungerade produktinfo_spaltezwei">' . $zucker1 . '</div>	
<div class="produktinfo_ungerade produktinfo_spaltedrei">' . $zucker2 . '</div>	
<div class="produktinfo_spalteeins">Fett</div>	
<div class="produktinfo_spaltezwei">' . $fett1 . '</div>	
<div class="produktinfo_spaltedrei">' . $fett2 . '</div>	
<div class="produktinfo_ungerade produktinfo_spalteeins_hoch">gesätt. Fettsäuren</div>	
<div class="produktinfo_ungerade produktinfo_spaltezwei_hoch">' . $fettsaeuren1 . '</div>	
<div class="produktinfo_ungerade produktinfo_spaltedrei_hoch">' . $fettsaeuren2 . '</div>
<div class="produktinfo_spalteeins">Ballaststoffe</div>	
<div class="produktinfo_spaltezwei">' . $ballaststoffe1 . '</div>	
<div class="produktinfo_spaltedrei">' . $ballaststoffe2 . '</div>	
<div class="produktinfo_ungerade produktinfo_rundeins">Natrium</div>	
<div class="produktinfo_ungerade produktinfo_spaltezwei">' . $natrium1 . '</div>	
<div class="produktinfo_ungerade produktinfo_rundzwei">' .  $natrium2 . '</div>';

}

add_shortcode('produktinfo', 'produktinformation');

Wenn ich jetzt die erste auskommentiere, funktioniert die zweite Funktion.


Ein anderes Problem: Funktion 1 gibt mir das Ganze über dem Wordpress-Content aus, anstatt innerhalb. Sollte ich nun bei Funktion 1 "return" verwenden, gibt mir die Funktion nur einen Link aus, anstatt wie gewünscht fünf. Der Permalink und der Titel werden außerdem als Text und nebeneinander ausgegeben.

PHP:
function fuenf_rezepte() { ?>
<ul>
<?php global $post;
	$arguments = array( 'numberposts' => 5, 'orderby' => 'rand', 'meta_key' => 'Produkt', 'meta_value' => $post->post_title );
	$my_query = get_posts($arguments);
	$link = get_permalink();
	foreach($my_query as $post) :
		setup_postdata($post);
		return '<li><a href="' . the_permalink() . '">' . the_title() . '</a></li>';
	endforeach; ?>
</ul>
<?php }

add_shortcode('fuenfrezepte', 'fuenf_rezepte');
 
Zuletzt bearbeitet:
Versuch es doch mal so:

PHP:
function fuenf_rezepte() {
    global $post;
    $result = '<ul>';
    $arguments = array( 'numberposts' => 5, 'orderby' => 'rand', 'meta_key' => 'Produkt', 'meta_value' => $post->post_title );
    $my_query = get_posts($arguments);
    $link = get_permalink();
    foreach($my_query as $post) :
        setup_postdata($post);
        $result .= '<li><a href="' . the_permalink() . '">' . the_title() . '</a></li>';
    endforeach;
    $result .= '</ul>';

    return $result;
}

add_shortcode('fuenfrezepte', 'fuenf_rezepte');
 
$post ist das Problem. In der Funktion fuenf_rezepte() definierst du $post als global.
In der Schleife überschreibst du jedesmal $post mit jedem Eintrag von $my_query. Ich glaube, das item in der Schleife sollte nicht auch $post heissen.
Auf alle Fälle hast du nach fuenf_rezepte() den letzten Eintrag von $my_query in global $post gespeichert.

In der 2ten Funktion greifst du wieder auf global $post zu. Dies wurde jedoch wie oben beschrieben in fuenf_rezepte() bereits überschrieben.

Zum return:
Return gibt das Resultat aus und bricht die Funktion ab. Du hast das Return in deiner Schleife drin. Also wird beim ersten Durchgang das entsprechende Resultat ausgegeben und die Funktion angehalten.

PHP:
    //Array für die Ausgabe initialisieren, damit dies sicher immer ien Array ist
    $items = array();
    //Hab hier $post mal durch $item ersetzt
    foreach($my_query as $item) :
        setup_postdata($item);
        //Jedes item hinzufügen
        $items[] = '<li><a href="' . the_permalink() . '">' . the_title() . '</a></li>';
    endforeach; 
    //Array aller Items zurückgeben
    return $item;

Ich sehe aber gerade, dass du wahrscheinlich immer das gleiche Resultat bekommst, das die Funktionen the_permalink() und the_title() keine Paramter haben.

Fazit:
Globale Variablen sollten nur selten verwendet werden. Ansonsten führt das unweigerlich zu einem Chaos weil man nicht weiss, wo sich was verändert
 
Danke für die Hilfe. Leider funktioniert beides nicht.

@saftmeister So ähnlich hatte es auch schon versucht. Gibt mir aber nur einen Link aus.
Übrigens das gleiche Probleme wie bei meiner Funktion.

@yaslaw Hier bekomme ich den Fehler:
HTML:
Catchable fatal error: Object of class stdClass could not be converted to string in /wp-includes/shortcodes.php on line 206
Wie könnte ich außerdem das mit den Links und dem Titel lösen?
 
Keine Ahnung wie du das mit den Links und Titel lösen kannst. Ich weiss ja nicht einmal was die Funktionen the_permalink() und the_title() eigentlich machen. Ich seh nur deren Aufruf. Auch weiss ich nciht, was in diesem $post genau drin ist und was die Funktion setup_postdata() macht.

Zum Fehler. Ah, Zeile 206, Moment ich schalte mich kurz auf deinen Rechner .......... aja, da fehlt ein Komma.
Im Ersnt. Da steht dass irgned etwas irgendwo wo in ein Standartobjekt gewandelt werden sollte und dies nicht geht. Ohne Code und Infos kann dir da niemand weiterhelfen
 
Und was steht in der Zeile 206 denn für Code? Warum kann man das nicht gleich mit dazu schreiben? Wenn es ein Objekt ist, was da direkt in den String z.B. durch Concatenation eingebaut werden soll, funktioniert das natürlich nicht. Du musst auf die jeweilige Eigenschaft des Objektes zu greifen. Wenn du nicht weißt, welche Eigenschaft zu nehmen ist, kannst du das Objekt mit var_dump() ausgeben:

PHP:
echo "<pre>";
var_dump($object);
echo "</pre>";
 
In Zeile 206 der Datei shortcodes.php steht:
PHP:
return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ) . $m[6];

Die Zeile gehört zur Funktion:
PHP:
function do_shortcode_tag( $m ) {
	global $shortcode_tags;

	// allow [[foo]] syntax for escaping a tag
	if ( $m[1] == '[' && $m[6] == ']' ) {
		return substr($m[0], 1, -1);
	}

	$tag = $m[2];
	$attr = shortcode_parse_atts( $m[3] );

	if ( isset( $m[5] ) ) {
		// enclosing tag - extra parameter
		return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ) . $m[6];
	} else {
		// self-closing tag
		return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, NULL,  $tag ) . $m[6];
	}
}



the_title() gibt den Titel des Posts aus.
(http://codex.wordpress.org/Function_Reference/the_title)

get_permalink() gibt den Permalink zum Post zurück.
(http://codex.wordpress.org/Template_Tags/get_permalink)
 
Zuletzt bearbeitet:
Dann gibt es da jetzt mehrere Möglichkeiten. Wie man sehen kann, wird eine String-Verkettung (Concatenation) vorgenommen, was man am Punkt zwischen den Variablen/Funktionen erkennen kann. Ein Element davon gibt jetzt ein Objekt zurück.

Du wirst nicht drum herum kommen, dir mal den var_dump() davon anzusehen:

PHP:
echo "<pre>";
var_dump($m[1], call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ), $m[6]);
echo "</pre>";

Die Ausgabe davon postest du mal.
 
@saftmeister Hab jetzt aus der Funktion mal alles raus bis auf deinen Code.
PHP:
function fuenf_rezepte() { ?>
<?php
   echo "<pre>";
var_dump($m[1], call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ), $m[6]);
echo "</pre>";
?>
<?php }

add_shortcode('fuenfrezepte', 'fuenf_rezepte');

Folgendes wird ausgegeben:
HTML:
Warning:  call_user_func() expects parameter 1 to be a valid callback, no array or string given in /Users/*/wp-content/themes/*/functions.php on line 740

NULL
NULL
NULL

Ich weiß eh nicht was das bringen soll. Damit siehst du ja nur was mit der Wordpress-Funktion nicht stimmt. Nur kann da aber nichts falsch sein.
 
Zuletzt bearbeitet:
Den Code hättest du zusätzlich einbauen sollen. Jetzt hast du das Ergebnis verfälscht. Versuch mal das hier:

PHP:
function do_shortcode_tag( $m ) {
    global $shortcode_tags;

    // allow [[foo]] syntax for escaping a tag
    if ( $m[1] == '[' && $m[6] == ']' ) {
        return substr($m[0], 1, -1);
    }

    $tag = $m[2];
    $attr = shortcode_parse_atts( $m[3] );

    echo "<pre>";
    var_dump($m, $tag, $attr, call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ));
    echo "</pre>";

    if ( isset( $m[5] ) ) {
        // enclosing tag - extra parameter
        return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ) . $m[6];
    } else {
        // self-closing tag
        return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, NULL,  $tag ) . $m[6];
    }
}
 
Zurück