• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

[PHP] PHP & die Verkettung von elseif's (in WordPress)

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Liebe Community!

Habe ein sehr merkwürdiges Problem. Ich habe, um das Header-Bild für jede Seite ändern zu können, die header-php im WP Backend Bereich verändert. Funktioniert so auch wunderbar…

Jetzt binde ich allerdings PHP ein, um die Page-ID zu finden und das entsprechende Bild auszugeben.
Die ganze Geschichte besteht also aus einem <img/> tag und einer Verkettung von elseif's also etwa so:
Code:
<img src='<?php
if([i]bedingung[/i]) {
     echo([i]url des bildes[/i]);
     }
elseif([i]bedingung[/i]) {
     echo([i]url des bildes[/i]);
     }
elseif([i]bedingung[/i]) {
     echo([i]url des bildes[/i]);
     }
elseif([i]bedingung[/i]) {
     echo([i]url des bildes[/i]);
     }
else {
     echo([i]urls des bildes[/i]);
     }
?>' width="950" height="180>" alt="" />

Nun folgender Fehler:
Es funktioniert ausschließlich das if, das erste elseif und das else am Ende.
Alle andere elseifs in der Mitte geben einfach nichts aus und sorgen dafür, dass WP "crashed" also eine von Inhalt befreite, weiße Seite, in der nur noch der Blog-Titel steht.


Ich würde mich sehr über eine Antwort freuen und danke für jeden sinnvollen Hinweis!!!
Liebe Grüße
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
theoretisch ist alles chic, aber dein code ist nicht wirklich aussagekräftig dadurch das du ihn vereinfacht hast.
das korrekte if-konstrukt wäre hilfreich.
Was aber sicher helfen könnte ist wenn du testweise mal vor deinem ganzen if-konstrukt folgendest schreibst:

<?php error_reporting(E_ALL); ?>
Damit werden dir evtl nicht vorhandene Variablen ausgegeben da damit der php fehlerreport levelübergreifend scharfgeschaltet ist. und so wie du es schilderst passiert da etwas das das script beendet aber die fehlermeldung nicht ausgegeben wird.

Der ordnung halber rate ich aber davon ab in ein html-tag ein solch riesiges konstrukt zu schreiben.
mach es lieber so:

<?php
if(cond){
$var = 'foo';
}elseif(cond){
$var = 'bar';
}else{
$var = 'foobar;
}
?>

<img src='<?php echo $var; ?>' />

ist übersichtlicher und damit weniger fehleranfällig
 

redrat

Grahams Jubiläumsapfel
Registriert
20.01.09
Beiträge
104
Abgesehen davon, dass der von Dir beschrieben Code funktionieren sollte, kann man ohne genaue Angabe der "Bedingung" keiner weitere Fehlerforschung betreiben. Unabhängig davon solltest Du aber mal überlegen ob Du statt dem unübersichtlichen if-elseif-gesumpfs nicht lieber die switch-Anweisung nutzt. Denn genau für solche Fälle wurde diese gemacht.

red
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Na gut…*Ich halte diese Schreibweise weder für übersichtlicher, noch für weniger fehleranfällig. Denn wenn mans genau nimmt, sind die Konstrukte ziemlich genau identisch.

Mein genaues Konstrukt hab ich ja gegeben. Nur ein bisschen vereinfacht.
Trotzdem hier das ganz genaue:
Code:
<img src='<?php
	if (is_home()) {
		echo("http://……/wp-content/uploads/2010/12/startl.jpg");
	        }
          elseif (is_page(4)) {
		echo("http://……/wp-content/uploads/2010/12/ueberuns.jpg");
	        }
          elseif (page_is(32)) {
		echo("http://……/wp-content/uploads/2010/12/security.jpg");
	        }
          elseif (is_page(22)) {
		echo("http://……/wp-content/uploads/2010/12/referenzen.jpg");
	        }
          elseif (is_page(18)) {
		echo("http://……/wp-content/uploads/2010/12/philosophie.jpg");
	        } 
          elseif (is_page(28)) {
		echo("http://……/wp-content/uploads/2010/12/parkservice.jpg");
	        }
          elseif (is_page(24)) {
		echo("http://……/wp-content/uploads/2010/12/limouservice.jpg");
	        }
          elseif (is_page(30)) {
		echo("http://……/wp-content/uploads/2010/12/komplettservice.jpg");
	        }
          elseif (is_page(8)) {
		echo("http://……/wp-content/uploads/2010/12/fuhrpark.jpg");
	        }
          elseif (is_page(10)) {
		echo("http://……/wp-content/uploads/2010/12/einsatzbereiche.jpg");
	        }
          else {
		echo("http://……/wp-content/uploads/2010/12/startl.jpg");
	       } ?>' width="950" height="180>" alt="" />


Das debugging-Teil hat nicht[Ib] geholfen. Es ist einfach nichts passiert, keine Änderung.
Aber schon mal danke

 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Abgesehen davon, dass der von Dir beschrieben Code funktionieren sollte, kann man ohne genaue Angabe der "Bedingung" keiner weitere Fehlerforschung betreiben. Unabhängig davon solltest Du aber mal überlegen ob Du statt dem unübersichtlichen if-elseif-gesumpfs nicht lieber die switch-Anweisung nutzt. Denn genau für solche Fälle wurde diese gemacht.

red


Also ich halte die switch Anweisung nicht für übersichtlicher. Und sie scheint mir auch nicht so viel Sinn zu machen.
Ich werde es aber mal kurz ausprobieren
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Ist das so gemeint:
Code:
switch($i) {
        case(is_home()):
		echo("http://……/wp-content/uploads/2010/12/startl.jpg");
	case(is_page(4)):
		echo("http://……/wp-content/uploads/2010/12/ueberuns.jpg");
	case(page_is(32)):
		echo("http://……/wp-content/uploads/2010/12/security.jpg");
	case(is_page(22)):
		echo("http://……/wp-content/uploads/2010/12/referenzen.jpg");
	case(is_page(18)):
		echo("http://……/wp-content/uploads/2010/12/philosophie.jpg");
	case(is_page(28)):
		echo("http://……/wp-content/uploads/2010/12/parkservice.jpg");
	case(is_page(24)):
		echo("http://……/wp-content/uploads/2010/12/limouservice.jpg");
	case(is_page(30)):
		echo("http://……/wp-content/uploads/2010/12/komplettservice.jpg");
	case(is_page(8)):
		echo("http://……/wp-content/uploads/2010/12/fuhrpark.jpg");
	case(is_page(10)):
		echo("http://……/wp-content/uploads/2010/12/einsatzbereiche.jpg");
	default:
		echo("http://……/wp-content/uploads/2010/12/startl.jpg");
	}
???

Oder hab ich dabei was missverstanden?
 
Zuletzt bearbeitet:

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Hatte jetzt den einzigen Effekt, dass die Seiten zwar funktionieren, allerdings nur das Fragezeichen erscheint.
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
an der stelle finde ich ein switch etwas gewagt! man bekommt es zwar damit zum laufen aber eigentlich ist es für die wertekontrolle.
man kann zwar ein switch dahingehend mishandeln das es das macht was du möchtest aber ob das so konform ist wage ich zu bezweifeln!
zumal die denkweise dann anders ist. In anderen sprachen funktionieren bedingungen wie in einem if auch in einem switch ebenso wie >= usw.

is_page(X) ist denke ich mal eine hauseigene funktion von WP die true zurückliefert wenn es die entsprechende seite ist.

wenn du also meinetwegen grade auf seite 10 bist und möchtest das über ein if abprüfen schreibst du (wie du es ja auch richtig gemacht hast)
if(is_page(10)){echo "seite 10;}

die bedingung muss also erfüllt sein (true)
wenn du aber mit boolschen werten in einem switch arbeitest (was ich irgendwie nicht so pralle finde) musst du negieren.
Wir sind immer noch bei page 10

switch($i){
case (!is_page(10)): echo "seite 10";break;
default: echo "currywurst";break;
}

und diese schreibweise ist programmierlogisch absoluter bullshit!!!
kannst hier mal sehen..

<?php
$i = null;
switch($i){
case(true): echo "1";break;
case(true): echo "2";break;
case(true): echo "3";break;
case(true): echo "4";break;
}
?>

so kommt keine ausgabe da kein default, setzt du jetzt aber beispielsweise die 3 auf false wird diese ausgegeben!
Fazit: du möchtest eine reaktion bei page 10 haben musst aber sagen wenn es nicht page10 ist...
Bitte bleib bei deinem if-else das ist sauberer. oder jetzt wo du alles fertig hast, setze vor jedes is_page ein ausrufezeichen zum negieren.

Gibt es denn alle seiten die du über is_page abfragst?

teste mal bitte folgendes:
var_dump(is_page(x));

start dem x setzt du mal bitte eine pagenummer ein bei der er dir den fehler bringt. mich würde mal interessieren was er da für einen rückgabewert liefert.
kann auch sein das die in der funktion bei nicht erfüllung ein exit; drin haben was natürlich sehr ärgerlich wäre.
 
  • Like
Reaktionen: Mini-Leopard

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Gibt mit
Code:
bool(false)
aus.
Für mich nicht so ganz begreiflich… Weil ja nur der erste elseif funktioniert.
Und das letzte else auch!

Sprich ein exit kommt nicht in frage.
Irgendwie eigenartig :/
 

das_micha

Leipziger Reinette
Registriert
11.03.07
Beiträge
1.795
jo, das exit können wir schonmal ausschliessen.
und du warst bei der ausgabe auch auf der seite die dort in der bedingung bzw in dem var_dump stand? wenn ja ist da irgendwas mit deiner pagekennung nicht ganz koscha.
denn bei ner übereinstimmung müsste bool(true) kommen.
was aber immer noch nicht erklärt wieso er dir die seite leerfegt.
ach nur zur schonung deiner finger, ein echo braucht keine klammern, funktioniert zwar auch mit aber ist eigentlich ohne vorgesehen. hat aber mit dem problem nix zutun
 

Mini-Leopard

Rhode Island Greening
Registriert
20.03.08
Beiträge
476
Danke danke… Das mit den Klammern hatte ich mir mal angewöhnt, nachdem ich Probleme hatte, beim zusammen mehrerer Strings und Posts ($_Post[xy].string…).
Aber klar, brauchts nicht, da hast Du Recht.

Jetzt wundere ich mich nur noch über die leeren Seiten.


Vielen Dank so weit schon mal.