Beiträge von finno

    Hallo!

    Ich bin langsam am verzweifeln wegen der Ladezeit meiner Website. Eine Analyse bei http://gtmetrix.com/ ergibt, dass nur alleine für das html Dokument (also der erste Eintrag in der Kaskade) 2,77 Sekunden benötigt werden. Davon sind 2,34 Sekunden als Wartezeit ausgewiesen. Wenn ich es richtig verstanden habe, ist das genau die Zeit, die der Server benötigt, um php auszuführen. Google empfiehlt übrigens eine maximale Server-Response Time von 0,2 Sekunden.

    Wenn ich alle Plugins (es sind viele) deaktiviere, liegt die Wartezeit für das html Dokument immer noch bei 0,524 s. Dasselbe Theme setze ich auch bei einer anderen Website auf einem anderen Server ein. Dort ist die Ladezeit ähnlich miserabel. Es sollte also nicht am Server liegen. Austauschen kann ich das Theme leider nicht, da ich schon seit Jahren dran rumeditiere und zahlreiche Funktionen verloren gehen würden.

    Lange Vorrede. Jetzt zu meinem Plan. Ich möchte die Scripte, die besonders lange benötigen, identifizieren. Am liebsten in den Plugins und im Theme. Dann kann ich versuchen, unnötige Funktionen wegzulassen oder rechenintensive Funktionen neu zu programmieren. Leider habe ich keine Ahnung, wie ich bei der Suche vorgehen soll. Gibt es evtl ein Plugin, dass dabei hilft? Und falls ich manuell rangehen muss - wie komme ich an die benötigte Ausführzeit jeder einzelnen php Datei?

    Die lange Leitung liegt übrigens nicht an den Datenbankabfragen. Die benötige Zeit dafür kann man sich mit dem Plugin "Query Monitor" anzeigen lassen. Liegt bei mir immer unter 0,05 Sekunden für alle Queries zusammengerechnet.

    Puuh, ich hoffe, ich hab's verständlich formuliert. Danke für die Aufmerksamkeit :)

    himitsu
    Genau so hatte ich es auch erst versucht. Das Ergebnis war, das die Ausgabe zwei mal erfolgt ist. D.h. alles in der adswigdet.php wurde direkt ausgegeben. Trotzdem wurde nach dem include nochmal alles mittels ob_get_flush() gespeichert.

    Wenn ich ob_start() und ob_get_flush() nur in der der adswidget.php verwende, passiert genau dasselbe. Ich dachte mir deshalb, ob_start() wirkt vielleicht nicht scriptübergreifend. Also habe ich es in beiden Sripten eingebaut. In der functions.php habe ich den Ausgabepuffer dann mit ob_end_clean() beendet, da ich ja nicht noch eine Variable befüllen muss.

    Ich hoffe, ich hab mich halbwegs verständlich ausgedrückt :) ...wenn man für die adswidget.php ein einfaches einzeiliges Sript (echo "Test"; )einsetzt, kann man meinen Fall übrigens leicht rekonstruieren. Falls es jemand selbst ausprobieren will. Den Shortcode kann man dann statt in einem Textwidget natürlich auch in jedem Post unterbringen / ausgeben lassen.

    Klasse, mit den Funktionen ist ja das zwischenspeichern schnell gemacht. Hab es jetzt so gelöst:

    PHP
    function shortcodefunction($atts){
    ob_start();
    include ($_SERVER['DOCUMENT_ROOT']."/wp-content/plugins/ads/adswidget.php");
    ob_end_clean();
    return $ausgabe;}

    Und in der adswidget.php alles mit

    PHP
    ob_start();
    ...
    $ausgabe = ob_get_flush();

    umschließen.

    Dankeschön!

    Moin,

    kann mir jemand helfen, wie ich kontrollieren kann, an welcher Stelle die Shortcode-Ausgabe genau erfolgt?

    So weit ich weiß, löst man das, indem man die ganze Ausgabe, die eine Shortcode Funktion machen soll, in eine String Variable packt und am Ende mit return ausgibt. Bei mir wäre das aber mit etwas Arbeit verbunden, da ich über 300 Zeilen Code in einen String verpacken müsste. Hier mal ein kurzer Umriss des Ablaufs:

    - in einem Textwidget möchte ich den Shortcode etwa folgendermaßen verwenden:

    Code
    Beliebiger Text
    <div>...google adsense code...</div>
    noch ein Textabsatz
    [shortcode]

    - dazu steht in der functions.php folgendes:

    PHP
    function shortcodefunction(){
    include ($_SERVER['DOCUMENT_ROOT']."/wp-content/plugins/ads/adswidget.php");
    }
    
    
    add_shortcode('shortcode', 'shortcodefunction');

    - in der adswidget.php steht schließlich alles, was ausgegeben werden soll. Etwa 300 Zeilen html, etwa 100 Zeilen php

    ...Wordpess spuckt aber leider alles was zum Shortcode gehört gleich am Anfang des Widgetbereichs aus, statt da wo ich das Shortcode Tag verwende.

    Gibt es eine einfachere Lösung, als die Ausgabe der adswidget.php in einen String zu verpacken?

    Moin,

    zuerst der Code:

    HTML
    <form action="<?php get_permalink($post->ID)?>" id="anker" method="post"> 
    <input type="text"  name="text1" />
    <input type="submit" name="submit" value="absenden" />
    </form>

    Wenn sich der Browser bei einer Sprungmarke befindet (#anker), und dann das Formular abgesendet wird, dann steht hinterher in der Adresszeile immernoch der Anker. Soll er aber nicht. Die Funktion get_permalink mit echo ausgegeben liefert die korrekte URL ohne Sprungmarke. Wenn ich beim action-Attribut die URL direkt eintrage, dann funktionierts allerdings und nach absenden befindet sich kein Anker mehr in der Adresszeile. Also liegt es nun an get_permalink oder nicht? Und gibt es ggf eine andere Möglichkeit das Formular an sich selbst abzuschicken (nur um den Anker "bereinigt")? Wenn ich übrigens das action Attribut leer lasse, bleibt der Anker in der Adresszeile auch bestehen.

    lg

    Ich habe dasselbe Problem. Wie es aussieht werden alle Tweets, die einen Link enthalten (egal worauf verlinkt wird) rausgefiltert. Die ohne Link kann ich über die Suche finden. Gespamt habe ich übrigens nie. Nur einen einzigen Tweet inkl Link verfasst und den Account dann über 2 Jahre nicht mehr angefasst. Nun habe ich seit gestern eine Handvoll Tweets und Retweets mit Link verfasst und festgestellt, dass nichts über die Suchfunktion auffindbar ist. ....außer wie gesagt Tweets ohne Link

    Hehe, ich verstehe gut, dass Helfende nicht so gut drauf zu sprechen sind, wenn jemand ohne die nötigen Grundkenntnisse und entsprechende Eigeninitiative um Rat fragt. Glaub mir aber bitte, dass ich schon nen ganzen Tag auf wordpress.org u Co unterwegs war bevor ich hier gepostet habe. Grundkenntnisse muss ich mir aus Zeitgründen leider nach und nach aneignen...

    Solange dämmert mir aber das Prinzip. $post ist wohl nur für Posts (wie der Name schon sagt). Bei einer Archivseite machen ja auch Werte wie post_content oder post_excerpt keinen Sinn. Ich hab das ganze auch mal auf einer anderen Seite beim twentythirteen Theme ausprobiert. Da wird natürlich auch die ID des letzten Posts angezeigt.

    Wen es interessiert - an die ID außerhalb von Posts kommt man mit get_queried_object_id()

    Also nichts für ungut bitte. Problem gelöst. Und nochmals danke für die Bemühungen!

    Danke für die Hilfe!

    alchymyth
    is_home springt bei der Archivseite (/blog) an UND bei einer Artikelseite ebenfalls (/article1288 ).

    Shadow
    Ich hatte [COLOR=#333333]echo $post->ID; ganz oben in der index.php meines Themes eingefügt. Wenn ich richtig liege, müsste das doch eine Stelle außerhalb des Loop sein, quasi der Ausgangspunkt aller php Scripte. Deshalb ist es ja auch so verwunderlich. Im Dashbord sehe ich nämlich, dass die ID von /blog 11 ist, genauso auch in der Datenbank. Nur die Abfrage via php ergibt immer die ID, des zuletzt veröffentlichten Posts.
    [/COLOR]
    Irgendwas muss es mit der $post Variable zu tun haben. Schließlich ist sie immer mit den Daten des letzten Post bestückt. Keine Ahnung, ob die irgendwo resettet hätte werden müssen und jetzt auch außerhalb des Loops noch verfügbar ist. Das ist jetzt aber nur noch Halbwissen und wilde Spekulation :)

    Hi,

    mein eigentliches Problem ist, dass ich eine Unterscheidung zwischen Post und Kategorie (bzw Übersichtsseite) machen möchte. Folgendes klappt aber leider nicht:

    Code
    if($post->ID == 11){echo "Kategorie";}
    else{echo "Post";}

    Das Problem ist, dass auf meiner statischen Seite http://www.../blog, auf der die Artikel (als Snippets) ausgegeben werden, die Variable $post immer die Daten des letzten Posts enthält. Wenn ich zB ganz am Anfang der index.php (Graphene Theme) den oben genannten Code einfüge, wird auf der Blogseite "Post" ausgegeben. In der Datenbank sehe ich aber, dass die ID der entsprechenden Seite in wp_posts gleich 11 ist.

    Vielleicht verständlicher: Für folgenden Code in der index.php wird auf meiner Blogseite "1288" ausgegeben:

    Code
    echo $post->ID;

    Die korrekte ID wäre aber "11".

    Weiß jemand, wie ich mir die echte ID der Blogseite ausgeben lassen kann? Oder gibt es vielleicht eine andere Möglichkeit, wie ich die Blogseite eindeutig identifizieren kann (bzw von Artikeln unterscheiden)??

    BG

    Hi,

    ich ändere ab und zu Kleinigkeiten an den Dateien von Plugins, Themes oder Wordpress selbst. Anschließend traue ich mich nicht mehr, Updates durchzuführen. Wenn ich mich nicht irre, müssten ja dann die Änderungen verloren gehen. Ist das richtig? Und gibt es ne Lösung?

    Ein konkretes Beispiel:
    Ich möchte aktuell den Text, der über dem Kommentarfeld bei Artikelseiten angezeigt wird, ändern ("Hinterlasse eine Antwort"). Dazu würde ich jetzt normalerweise die comment-template.php von Wordpress entsprechend editieren. Und beim nächsten Update fang ich wieder von vorne an, da die Datei komplett ersetzt wird (glaub ich zumindest)...

    Muss ich damit leben, mir alle Änderungen abzuspeichern und sie nach Updates erneut durchzuführen?

    Zitat

    [COLOR=#333333]Du kannst per PHP Script den Crawler erkennen und ihm den Inhalt erst garnicht anzeigen.[/COLOR]


    Das wäre dann wohl cloaking :D ...sollte Google mal einen Crawler einsetzen, der nicht von meinem Script erkannt wird, laufe ich Gefahr, dass der Beschiss auffliegt und ich komm nicht mehr mit einem blauen Auge davon. Aber danke für den Tipp! Vielleicht überleg ich mir das irgendwann nochmal.

    Zitat

    [COLOR=#3E3E3E]Dies kann deinen pagespeed negativ beeinlussen. Wenn der Content erst nach 3 Sekunden vollständig da ist... fliegt deine Seite mehr oder weniger aus der Sichtbarkeit.[/COLOR]


    Ich gehe einfach mal davon aus, dass Google die vorhandenen Inhalte trotzdem indexiert. Ist ja eine komplette Webseite Suchmaschinenzugänglich vorhanden. Nur vom $("#display").load(...) kommt halt keine Antwort.

    Google Pagespeed gibt der Seite übrigens ab einem Delay von 10 Sekunden gute 90 Punkte!! Die Werbung wird in der Vorschau nicht dargestellt. Bei einem Delay von 9 Sekunden oder weniger bekomme ich immerhin noch 80 Punkte und die Werbung wird in der Vorschau dargestellt. Ich tippe mal darauf, dass das Delay gar nicht zur Ladezeit mitgerechnet wird. Außerdem lässt sich dadurch hoffentlich nicht auf das Verhalten des Crawlers schließen. Ich hoffe der bricht nicht erst nach 10 Sekunden ab.

    Da fällt mir ein, ich mache am besten mal einen Test dazu. Wenn ich die Technik bei einer gut gecrawlten Domain einsetze und statt Werbung einen Textabsatz verzögert einblende, müsste ich doch nach ein paar Tagen sehen, ob der Text indexiert wird oder nicht. Ergo ob der Crawler den Request abwartet oder nicht. Denke ich zu kompliziert? Gibt's noch ne Möglichkeit?

    Zitat

    [COLOR=#333333]Warum brauchst Du ein Dely, wenn ich fragen darf?[/COLOR]


    In meinem Fall muss es glaube ich ein serverseitiges Delay sein. Ich probiere verschiedene Methoden aus, um Suchmaschinen Crawler abzuschütteln. Da es sich bei der Ausgabe der display.php um Werbung handelt, wird das von Google im Normalfall sofort mit Rankingverlust geahndet. Meine Hoffnung ist jetzt, diese Inhalte gut genug maskieren zu können, damit sie nicht als Werbung erkannt werden. Eine Möglichkeit, die ich testen will ist, die Inhalte erst nach 3 Sekunden einzublenden, in der Hoffnung, der Crawler hat die Seite schon wieder verlassen. Javascript wird zwar idR vom Googlebot ausgeführt, aber ich hoffe mal, dass Google nicht die Kapazitäten hat, beim Crawlprozess solange abzuwarten.

    Wie kann ich denn Funktionen aus der functions.php im Javascript nutzen? Meines Wissens nach geht das nicht und ich muss stattdessen den Request machen.

    Es geht ja darum, nachdem die Seite vollständig geladen ist, weitere Inhalte nachzuladen. Dabei soll auch noch ein sleep in der display.php verwendet werden, damit die Ausgabe erst nach ein paar Sekunden erscheint.

    Ich bin bisher immer ans Ziel gekommen, indem ich an den vorhandenen Dateien des Themes oder der Plugins rumeditiert habe. Für meine kleineren Probleme war weder OOP noch MVC nötig. Ein paar Grundlagen werde ich mir da aber wohl oder übel mal aneignen müssen..

    Zitat

    [COLOR=#3E3E3E]Die wp-load.php inkludiert schlichtweg alles. Steht aber auch in der Datei drin. Kann man aufmachen und lesen[/COLOR]

    Da geht's ja schon los - ich hatte auch mal reingeschaut und gesehen das die wp-config.php und wp-settings.php geladen wird. Aber ohne die WP Hierarchie ein wenig zu kennen, nützt mir das Wissen auch erstmal nicht viel. Aber sei's drum - danke nochmal, kommt ja doch noch etwas Licht ins Dunkel.

    Zitat

    [COLOR=#333333]Entweder setzt Du Dich mal intensiver mit dem Thema auseinander oder Du wirst Dich dauerhaft im Kreis drehen[/COLOR]


    Das merke ich auch langsam. Hätte ich ein bischen mehr Zeit, würde ich liebend gerne nochmal php von Grund auf lernen ;)

    Zitat

    [COLOR=#333333]keine Objektinstanz der WPDB-Klasse > nix funktionieren[/COLOR]


    hmm ...jetzt muss ich mich auch noch mit oop auseinandersetzen? Ich versteh zwar nicht warum, aber durch das inkludieren der wp-load.php scheint jetzt ja auch das Objekt verfügbar zu sein. Zumindest funktioniert jetzt alles einwandfrei und ohne Fehlermeldung.

    Hast mir echt weiter geholfen. Ich hab zwar scheinbar zu viele Wissenslücken, um meinen Fehler so richtig zu kapieren ...aber es funzt!!! :D ...Danke!!

    Ok, nochwas - Lasse ich require() weg, bekomme ich jetzt diese Fehlermeldung:

    Zitat

    Fatal error: Call to a member function get_col() on a non-object in /PFAD/display.php on line 12

    Mit require('domain.tld/wp-blog-header.php') bekomme ich diese Fehlermeldung:

    Zitat

    Warning: require(): Unable to access domain.tld/wp-blog-header.php in /PFAD/wp-content/themes/graphene/display.php on line 7Warning: require(domain.tld/wp-blog-header.php): failed to open stream: No such file or directory in /PFAD/wp-content/themes/graphene/display.php on line 7 Fatal error: require(): Failed opening required 'domain.tld/wp-blog-header.php' (include_path='.:/usr/share/php:/usr/share/pear') in /PFAD/wp-content/themes/graphene/display.php on line 7

    Wenn ich bei require() statt der Domain den kompletten Pfad der Verzeichnisse auf dem Server angebe, bekomme ich gar keine Fehlermeldung im Browser, aber die Konsole meldet 404.

    Hier die komplette display.php:

    PHP
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    
    echo "abc";
    require( '/PFAD/wp-blog-header.php' );                                                                                   global $wpdb;
    $as = $wpdb->get_col( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = 2 AND meta_key LIKE '%abc'" );
    foreach ( $as as $nummer )
      {echo '</br>'.$nummer;   }

    Wenn ich die php Datei direkt im Browser aufrufe, sehe ich die korrekte Ausgabe der echo Anweisungen. Nur per Javascript in den <div id="display"></div> kann ich nichts einhängen. Der bleibt leer, es sei denn ich lösche die Zeile mit $wpdb->get_col().

    Wenn ich den Inhalt der display.php durch Code von formateins ersetze, bleibt beides leer. Sowohl der div, als auch die Ausgabe der display.php direkt im Browser.

    Ich bin mir allerdings auch nicht ganz sicher, ob mein Error Reporting in der php Datei wirksam ist. Auf eine zentrale php.ini Datei habe ich keinen Zugriff. Kann ich stattdessen einfach eine zweite im beliebigen Verzeichnis erstellen?