Platzieren Sie Anzeigen zwischen Nur-Text-Absätzen

Lesezeit: 21 Minuten

Benutzer-Avatar
Debajyoti Das

Ich verwende den folgenden Code, um Anzeigencode in meinem Inhalt zu platzieren .

<?php
$content = apply_filters('the_content', $post->post_content);
$content = explode (' ', $content);
$halfway_mark = ceil(count($content) / 2);
$first_half_content = implode(' ', array_slice($content, 0, $halfway_mark));
$second_half_content = implode(' ', array_slice($content, $halfway_mark));
echo $first_half_content.'...';
echo ' YOUR ADS CODE';
echo $second_half_content;
?>

Wie kann ich dies ändern, damit ich kann 2 Anzeigen schalten gleichzeitig zwischen Text nur Absätze (sowohl die <p>...</p> die Anzeige sollte keine Bilder oder eingebetteten Videos enthalten).

Ich möchte jQuery vermeiden.

Beispiel für meinen Anwendungsfall …
Beispiel für meinen Anwendungsfall

  • Ich möchte 2 Werbeblöcke in diesen Artikel einfügen.
  • Ich möchte, dass der erste Werbeblock nach dem ersten Absatz steht. Aber jedes Bild im ersten Absatz sollte entfernt werden.
  • Für die zweite Anzeige sollte sie möglichst in der zweiten Hälfte des Artikels zwischen einem Nur-Text-Absatz platziert werden, so dass ein Anzeigencode zwischen einer guten Menge Text eingeklemmt ist und nie sehr nahe an einem eingebetteten Bild oder Video usw.
  • Zwischen 2 Anzeigen sollten mindestens 2 Absätze liegen

  • “Platzieren Sie 3 Anzeigen in gleichem Abstand”, dh 3 Divs horizontal quer?

    – David

    19. September 2014 um 11:32 Uhr

  • @David – vertikal, wie 1para 2para AD 3para 4 para ….

    – Debajyoti Das

    19. September 2014 um 11:35 Uhr

  • Wollen Sie Ihre Website nicht mit so vielen Anzeigen zerstören? Seien Sie nur vorsichtig, wenn es sich um Google AdSense-Anzeigen handelt.

    – Pieter Goosen

    19. September 2014 um 12:08 Uhr

  • Was, wenn es ohne Bild oder Video kein Para gibt. Es kann kein Nein geben. von Anwendungsfällen. Was willst du eigentlich erreichen

    – Nitigjan

    19. September 2014 um 17:51 Uhr


  • Auf inhaltsreichen Seiten… ist das nicht möglich. Und wir haben einen Anwendungsfall, bei dem der 2., wenn nicht der 3., am Ende platziert werden sollte.

    – Debajyoti Das

    19. September 2014 um 18:12 Uhr

Benutzer-Avatar
Pieter Goosen

Hier ist meine Herangehensweise an die Frage. Tut mir leid, dass ich etwas spät gepostet habe (und das Kopfgeld verpasst habe 🙁 ), aber es war eine hektische Woche, also habe ich alles in Stücken und Stücken gemacht.

SCHNELLER ÜBERBLICK

  • Ich habe die Anhänge im ersten Absatz nicht entfernt. Ich verstehe nicht wirklich, warum Inhalte für eine Anzeige zerstört werden müssen

  • Ich habe ziemlich viele Überprüfungen in meinem Code durchgeführt, um sicherzustellen, dass Anzeigen nur zwischen reinen Textabsätzen eingefügt werden. Nur-Text-Absätze gelten als Absätze, die keine img-, li- und ul-Tags enthalten

  • Ich habe jeden Codeblock ordnungsgemäß dokumentiert, sodass Sie jeden Abschnitt problemlos durcharbeiten können. habe ich auch hinzugefügt todo doc-Blöcke, die Sie ggf. beachten müssen

  • Ich habe benutzt wptexturize um p-Tags anzuwenden the_content. Jeder doppelte Zeilenumbruch bildet einen Absatz

  • Ändern und verwenden Sie diesen Code nach Belieben. Ich habe es getestet, also ist es auf meiner Seite fehlerfrei.

Hier ist der Code. Hoffe, das funktioniert für Sie wie erwartet. * PS! All dies geht in Ihre functions.php. Es ist kein weiterer Code oder Mods für Ihre Vorlagendateien erforderlich

<?php
add_filter( 'the_content', 'so_25888630_ad_between_paragraphs' );

function so_25888630_ad_between_paragraphs($content){
    /**-----------------------------------------------------------------------------
     *
     *  @author       Pieter Goosen <http://stackoverflow.com/users/1908141/pieter-goosen>
     *  @return       Ads in between $content
     *  @link         http://stackoverflow.com/q/25888630/1908141
     * 
     *  Special thanks to the following answers on my questions that helped me to
     *  to achieve this
     *     - http://stackoverflow.com/a/26032282/1908141
     *     - http://stackoverflow.com/a/25988355/1908141
     *     - http://stackoverflow.com/a/26010955/1908141
     *     - http://wordpress.stackexchange.com/a/162787/31545
     *
    *------------------------------------------------------------------------------*/ 
    if( in_the_loop() ){ //Simply make sure that these changes effect the main query only

        /**-----------------------------------------------------------------------------
         *
         *  wptexturize is applied to the $content. This inserts p tags that will help to  
         *  split the text into paragraphs. The text is split into paragraphs after each
         *  closing p tag. Remember, each double break constitutes a paragraph.
         *  
         *  @todo If you really need to delete the attachments in paragraph one, you want
         *        to do it here before you start your foreach loop
         *
        *------------------------------------------------------------------------------*/ 
        $closing_p = '</p>';
        $paragraphs = explode( $closing_p, wptexturize($content) );

        /**-----------------------------------------------------------------------------
         *
         *  The amount of paragraphs is counted to determine add frequency. If there are
         *  less than four paragraphs, only one ad will be placed. If the paragraph count
         *  is more than 4, the text is split into two sections, $first and $second according
         *  to the midpoint of the text. $totals will either contain the full text (if 
         *  paragraph count is less than 4) or an array of the two separate sections of
         *  text
         *
         *  @todo Set paragraph count to suite your needs
         *
        *------------------------------------------------------------------------------*/ 
        $count = count( $paragraphs );
        if( 4 >= $count ) {
            $totals = array( $paragraphs ); 
        }else{
            $midpoint = floor($count / 2);
            $first = array_slice($paragraphs, 0, $midpoint );
            if( $count%2 == 1 ) {
                $second = array_slice( $paragraphs, $midpoint, $midpoint, true );
            }else{
                $second = array_slice( $paragraphs, $midpoint, $midpoint-1, true );
            }
            $totals = array( $first, $second );
        }

        $new_paras = array();   
        foreach ( $totals as $key_total=>$total ) {
            /**-----------------------------------------------------------------------------
             *
             *  This is where all the important stuff happens
             *  The first thing that is done is a work count on every paragraph
             *  Each paragraph is is also checked if the following tags, a, li and ul exists
             *  If any of the above tags are found or the text count is less than 10, 0 is 
             *  returned for this paragraph. ($p will hold these values for later checking)
             *  If none of the above conditions are true, 1 will be returned. 1 will represent
             *  paragraphs that qualify for add insertion, and these will determine where an ad 
             *  will go
             *  returned for this paragraph. ($p will hold these values for later checking)
             *
             *  @todo You can delete or add rules here to your liking
             *
            *------------------------------------------------------------------------------*/ 
            $p = array();
            foreach ( $total as $key_paras=>$paragraph ) {
                $word_count = count(explode(' ', $paragraph));
                if( preg_match( '~<(?:img|ul|li)[ >]~', $paragraph ) || $word_count < 10 ) {  
                    $p[$key_paras] = 0; 
                }else{
                    $p[$key_paras] = 1; 
                }   
            }

            /**-----------------------------------------------------------------------------
             *
             *  Return a position where an add will be inserted
             *  This code checks if there are two adjacent 1's, and then return the second key
             *  The ad will be inserted between these keys
             *  If there are no two adjacent 1's, "no_ad" is returned into array $m
             *  This means that no ad will be inserted in that section
             *
            *------------------------------------------------------------------------------*/ 
            $m = array();
            foreach ( $p as $key=>$value ) {
                if( 1 === $value && array_key_exists( $key-1, $p ) && $p[$key] === $p[$key-1] && !$m){
                    $m[] = $key;
                }elseif( !array_key_exists( $key+1, $p ) && !$m ) {
                    $m[] = 'no-ad';
                }
            } 

            /**-----------------------------------------------------------------------------
             *
             *  Use two different ads, one for each section
             *  Only ad1 is displayed if there is less than 4 paragraphs
             *
             *  @todo Replace "PLACE YOUR ADD NO 1 HERE" with your add or code. Leave p tags
             *  @todo I will try to insert widgets here to make it dynamic
             *
            *------------------------------------------------------------------------------*/ 
            if( $key_total == 0 ){
                $ad = array( 'ad1' => '<p>PLACE YOUR ADD NO 1 HERE</p>' );
            }else{
                $ad = array( 'ad2' => '<p>PLACE YOUR ADD NO 2 HERE</p>' );
            }

            /**-----------------------------------------------------------------------------
             *
             *  This code loops through all the paragraphs and checks each key against $mail
             *  and $key_para
             *  Each paragraph is returned to an array called $new_paras. $new_paras will
             *  hold the new content that will be passed to $content.
             *  If a key matches the value of $m (which holds the array key of the position
             *  where an ad should be inserted) an add is inserted. If $m holds a value of
             *  'no_ad', no ad will be inserted
             *
            *------------------------------------------------------------------------------*/ 
            foreach ( $total as $key_para=>$para ) {
                if( !in_array( 'no_ad', $m ) && $key_para === $m[0] ){
                    $new_paras[key($ad)] = $ad[key($ad)];
                    $new_paras[$key_para] = $para;
                }else{
                    $new_paras[$key_para] = $para;
                }
            }
        }

        /**-----------------------------------------------------------------------------
         *
         *  $content should be a string, not an array. $new_paras is an array, which will
         *  not work. $new_paras are converted to a string with implode, and then passed
         *  to $content which will be our new content
         *
        *------------------------------------------------------------------------------*/ 
        $content =  implode( ' ', $new_paras );
    }
    return $content;
}

BEARBEITEN

Aus deinen Kommentaren:

  • Sie sollten den folgenden Code zum Debuggen verwenden <pre><?php var_dump($NAME_OF_VARIABLE); ?></pre>. Für Ihre erste Ausgabe werde ich verwenden ?><pre><?php var_dump($paragraphs); ?></pre><?php kurz nach dieser Zeile $paragraphs = explode( $closing_p, wpautop($content) ); um genau zu sehen, wie der Inhalt aufgeteilt ist. Dies gibt Ihnen eine Vorstellung davon, ob Ihre Inhalte korrekt aufgeteilt werden.

  • Auch verwenden ?><pre><?php var_dump($p); ?></pre><?php kurz nach dieser Zeile $p = array(); um zu prüfen, welcher Wert einem bestimmten Absatz beigemessen wird. Denken Sie daran, Absätze mit img-, li- und ul-Tags sollten ein haben 0, auch Absätze mit weniger als 10 Wörtern. Der Rest sollte eine 1 haben

  • BEARBEITEN -> Problem mit entfernten Absätzen wurde behoben. Danke, dass du mich auf diesen Fehler hingewiesen hast. Habe das nie realisiert. Ich habe den Code aktualisiert, also einfach kopieren und einfügen

BEARBEITEN 2

Bitte beachten Sie, dass Sie Ihren Code nicht mit dem von Ihnen verwendeten Online-Tool testen können. Dies ist keine echte Widerspiegelung dessen, was ausgegeben wird the_content(). Die Ausgabe, die Sie mit Ihrem Online-Tool sehen, wird gefiltert und markiert, bevor sie an den Bildschirm gesendet wird the_content(). Wenn Sie Ihre Ausgabe mit einem Browser wie Google Chrome überprüfen, werden Sie feststellen, dass p-Tags korrekt angewendet werden.

Ich habe auch das a-Tag mit Bild-Tag im Code geändert

  • OMG, das funktioniert wie ein Zauber. VIELEN DANK, da ich meine Seite damit aktualisieren werde. Hat sich sehr bemüht, dies in vielerlei Hinsicht zu verfehlen, ist aber gescheitert. Solider Code. Alle Anforderungen bestanden. 🙂 Mein Respekt … Du verdienst ein Kopfgeld. Ich werde mich daran erinnern und dir einen verleihen, wenn ich selbst mehr habe.

    – Debajyoti Das

    28. September 2014 um 12:10 Uhr


  • Hinweis: explodiert mit </p> erstellt Ausgabe ohne die </p>. Also benutze ich $paragraphs = preg_split("/(?=<\/p>)/", $content, null, PREG_SPLIT_DELIM_CAPTURE); was gut zu funktionieren scheint.

    – Debajyoti Das

    19. Februar 2015 um 0:15 Uhr


Benutzer-Avatar
David

Mit dem Beispielcode, den Sie mir gegeben haben, ist dies das Beste, was ich tun kann, es waren viel zu viele Bilder darin, Sie würden ein Genie brauchen, um die für Ihre Anforderungen erforderliche Logik herauszufinden, aber probieren Sie es aus, es könnte nicht zu weit sein aus. Dafür benötigen Sie PHP 5.5.

ein paar punkte zu beachten:

1. Es identifiziert Absätze als in p-Elemente eingeschlossen, nicht wie in visuellen Absätzen.

2. Wenn p Elemente innerhalb anderer Elemente vorhanden sind, werden sie auch als Absätze erkannt. Die erste Anzeige ist ein Beispiel dafür. Vermeiden Sie die Verwendung von p innerhalb von Blockquotes, Listen usw., dies ist nicht erforderlich, verwenden Sie stattdessen spans, divs für Text.
3. Ich habe eine Zeile kommentiert, die eine Funktion in __construct aufruft, kommentieren Sie diese aus, um das zweite Bild einzufügen. Das funktioniert eigentlich gut, aber Ihr Inhalt hat viele p-Elemente mit Sätzen, die auf eine Reihe von p aufgeteilt sind. Dies ist wahrscheinlich kein Faktor für den tatsächlichen Inhalt.
4. Es sucht nach Bildern in Absatz 1 + Absatz 2 und entfernt sie.

$content = apply_filters('the_content', get_the_content() ); 

    class adinsert {


    var $content;
    var $paragraphs;    
    var $ad_pos1=2;
    var $ad_pos2;
    var $ad_pos3;
    var $ad= '<h1>ad position here</h1>';

public function __construct($content) {

    if(!$content)
        return $content;

    $this->set_content($content);

    $this->paragrapherize(2);
    $this->paragraph_numbers();
    $this->get_first_pos();
    $this->paragrapherize();
    $this->paragraph_numbers();
    $this->find_images();
    $this->find_ad_pos(); 
    $this->insert_ads();

}


public function echo_content(){
    echo $this->content;
}

private function insert_ads() {

    if($this->ad_pos2 && $this->ad_pos2 != 'end'):
        $posb= $this->ad_pos2;
        $this->content=substr_replace($this->content,$this->ad,$posb ,0);
    else:
        $this->content.= $this->ad;    
    endif;

    //comment the below line to remove last image insertion 
    $this->content.= $this->ad;
}

private function get_first_pos() {

    $i=0;

    foreach($this->paragraphs as $key=>$data):
        if($i==0):

            $length= $data['end']-$data['start'];
            $string= substr($this->content, $data['start'],$length);    
            $newkey= $key+1;
            $lengthb= $this->paragraphs[$newkey]['end']-$this->paragraphs[$newkey]['start'];
            $stringb= substr($this->content, $this->paragraphs[$newkey]['start'],$lengthb);

            $wcount= count(explode(' ', $string));

            if( preg_match('/(<img[^>]+>)/i', $string, $image) ):
                    $newstring=preg_replace('/(<img[^>]+>)/i', '', $string);

                        if($wcount>10):
                            $newstring.=$this->ad;
                            $this->ad_pos1=1;       
                            $this->content=str_replace($string,$newstring,$this->content);
                        endif;
            else:
                        if($wcount>10) :
                            $newstring=$string.$this->ad;
                            echo $newstring;
                            $this->ad_pos1=1;
                            //$this->content=str_replace($string,$newstring,$this->content);
                            $this->content= preg_replace('~'.$string.'~', $newstring, $this->content, 1);
                        endif;
            endif;

            if( preg_match('/(<img[^>]+>)/i', $stringb, $imageb) ):
                        $newstringb=preg_replace('/(<img[^>]+>)/i', '', $stringb);  
                        if($wcount<10) :
                        $newstringb.=$this->ad;
                        $this->ad_pos1=2;
                        $this->content=str_replace($stringb,$newstringb,$this->content);
                        endif;
            else:
                        if($wcount<10) :
                            $newstring=$stringb.$this->ad;
                            $this->ad_pos1=2;
                            $this->content=str_replace($stringb,$newstringb,$this->content);
                        endif;
            endif;

        else:
            break;
        endif;
        $i++;       
    endforeach;
}


private function find_ad_pos() {

    $remainder_images= $this->paragraph_count;
    if($remainder_images < $this->ad_pos1 + 3):
        $this->ad_pos2='end';
    else:   

        foreach($this->paragraphs as $key=>$data):
            $p[]=$key;
        endforeach;

        unset($p[0]);
        unset($p[1]);

        $startpos= $this->ad_pos1 + 2;
        $possible_ad_positions= $remainder_images - $startpos;
    //figure out half way
        if($remainder_images < 3): //use end pos
            $pos1= $startpos;
            $pos1=$this->getclosestkey($pos1, $p);
        else: // dont use end pos
            $pos1=  ($remainder_images/2)-1;
            $pos1= $this->getclosestkey($pos1, $p);
        endif;
        $this->ad_pos2= $this->paragraphs[$pos1]['end'];
    endif;
}


private function getclosestkey($key, $keys) {
    $close= 0;
    foreach($keys as $item): //4>4
        if($close == null || $key - $close > $item - $key ) :
          $close = $item;
        endif;
    endforeach;
    return $close;
}



private function find_images() {

    foreach($this->paragraphs as $item=>$key):
        $length= $key['end']-$key['start'];
        $string= substr($this->content, $key['start'],$length);
        if(strpos($string,'src')!==false && $item !=0 && $item !=1):
            //unset the number, find start in paragraphs array + 1 after
            unset($this->paragraphs[$item]);
            $nextitem= $item+1;
            $previtem= $item-1;
            unset($this->paragraphs[$nextitem]);
            unset($this->paragraphs[$previtem]);
        endif;          
    endforeach;

}





private function paragraph_numbers() {

    $i=1;
    foreach($this->paragraphs as $item):
        $i++;
    endforeach; 
    $this->paragraph_count=$i;
}

private function paragrapherize($limit=0) {

    $current_pos=0;
    $i=0;

    while( strpos($this->content, '<p', $current_pos) !== false ):

    if($limit && $i==$limit)
        break;

    if($i==105) {
        break;
    }
        if($i!=0) {
            $current_pos++; 
        }


        $paragraph[$i]['start']=strpos($this->content, '<p', $current_pos);//1

    //looking for the next time a /p follows a /p so is less than the next position of p

    $nextp= strpos($this->content, '<p', $paragraph[$i]['start']+1); //14 failing on next???
    $nextendp= strpos($this->content, '</p>', $current_pos);//22

    if($nextp>$nextendp)://NO
        $paragraph[$i]['end']=$nextendp;
        if( ($nextendp - $paragraph[$i]['start']) < 80 ):
            unset($paragraph[$i]);
        endif;

        $current_pos= $nextendp;
        $i++;   
    else:   

    $startipos = $nextendp;

        $b=0;                                           
        do {
            if($b==100){
               break;
            }

            $nextp= strpos($this->content, '<p', $startipos); //230
            $nextendp= strpos($this->content, '</p>', $startipos+1);//224


            if($nextp>$nextendp) {

                $paragraph[$i]['end']=$nextendp;
                $current_pos= $nextendp;

                $i++;
            } else {
                $startipos = $nextendp+1;
            }
            $b++;

        } while ($nextp < $nextendp );
    endif;
        endwhile;
        $this->paragraphs= $paragraph;
    }

    public function set_content($content) {
        $this->content= $content;
    }

}

$newcontent= new adinsert($content);

dann wo Sie Ihren Inhalt ausgeben möchten

 <?php echo $newcontent->echo_content(); ?>

  • Ja, es hat funktioniert… 🙂 1. Aber die 3. Anzeige wird direkt vor einem Bild platziert eval.in/private/2f5c211b9788c4 2. Und es entfernt auch vorhandene div-Blöcke. 3. Zwischen 2 Anzeigen sollten mindestens 2 Absätze stehen

    – Debajyoti Das

    19. September 2014 um 18:23 Uhr


  • Es entfernt auch vorhandene Nicht-p-Blöcke wie div table etc

    – Debajyoti Das

    19. September 2014 um 18:39 Uhr

  • Können Sie den eigentlichen HTML-Inhalt irgendwo einfügen, damit ich mir eine Vorstellung von der typischen Ausgabe machen kann? Es ist so konzipiert, dass es p als äußeren Wrapper verwendet, da ich davon ausgegangen bin, dass jeder Block daraus besteht. Sehen Sie sich auch den if else-Block an $ad_avail_positions das entscheidet, wann die Anzeigen geschaltet werden … wie viele Absätze wären es normalerweise? Wenn es sich um eine sehr große Varianz handelt, neigt die Funktion dazu, etwas aufgebläht zu werden, es sei denn, Sie können etwas Einfaches verwenden, z. etc!

    – David

    19. September 2014 um 20:00 Uhr

  • Sie können sehen, was ich definiert habe $content hier eval.in/private/2f5c211b9788c4 Hinweis: Tabellen und Listen werden in HTML nicht innerhalb des p-Blocks gebildet … sie befinden sich außerhalb. Ich denke, wir können diese allgemeinen Markups in getElementsByTagName einfügen. Was denken Sie

    – Debajyoti Das

    19. September 2014 um 20:53 Uhr


  • Gängige Tags außerhalb von

    sind

    ,

    ,

      ,

        ,

        – Debajyoti Das

        19. September 2014 um 20:59 Uhr

    Dies ist eine Lösung. Es ist nicht vollständig programmatisch, aber ich habe es schon einmal gemacht und es wird funktionieren. Verwenden Sie grundsätzlich einen „Shortcode“. Das Problem dabei, dies vollständig programmatisch zu tun, besteht darin, dass es keine nette Möglichkeit gibt, herauszufinden, ob der Fluss eines Artikels mit Inline-Bildern, Videos usw. dazu führen würde, dass die Anzeigenplatzierungen wirklich schlecht aussehen. Richten Sie Ihr CMS stattdessen mit einem Shortcode ein, damit Redakteure Anzeigen an optimaler Stelle im Artikel platzieren können.

    Z.B

    <p>Bacon ipsum dolor sit amet short ribs tenderloin venison pastrami meatloaf kevin, shoulder meatball landjaeger pork corned beef turkey salami frankfurter jerky. Pork loin bresaola porchetta strip steak meatball t-bone andouille chuck chicken shankle shank tongue. Hamburger flank kevin short ribs. Pork loin landjaeger frankfurter corned beef, fatback salami short loin ground round biltong.</p>
    
    [ad_block]
    
    <p>Pastrami jerky drumstick swine ribeye strip steak pork belly kevin tail rump pancetta capicola. Meatloaf doner porchetta, rump tenderloin t-bone biltong pork belly. Porchetta boudin ham ribeye frankfurter flank short loin, drumstick pork loin filet mignon chuck fatback. Strip steak jowl capicola ham hock turducken biltong ground round filet mignon venison prosciutto chuck pork. Venison ribeye fatback kielbasa, ball tip turducken capicola drumstick sausage pancetta boudin turkey ham strip steak corned beef.</p>
    

    Dann mit PHP str_replace Sie können den ad_block-Shortcode einfach mit Ihrem HTML für Ihre Anzeigen austauschen.

    Z.B

    echo str_replace('[ad_block]', $ad_block_html, $content);
    

    • Völlig einverstanden … Aber es macht nur für ziemlich neue Websites Sinn. Albtraum für eine bereits große Website, die von einer einzigen Person verwaltet wird.

      – Debajyoti Das

      19. September 2014 um 11:29 Uhr

    • Danke für den Speck … Entschuldigung, ich habe nicht das ganze Problem gelöst! 🙂

      – Leonhard Teo

      19. September 2014 um 11:31 Uhr

    Benutzer-Avatar
    Marcello Mönkemeyer

    Ich habe etwas nachgearbeitet und das ist, was ich endlich bekommen habe. Fühlen Sie sich frei zu testen und geben Sie mir ein Feedback.

    class Advertiser
    {
        /**
         * All advertises to place
         *
         * @access  private
         * @var     array
         */
        private $ads        = array();
    
        /**
         * The position behind the </p> element nearest to the center
         *
         * @access  private
         * @var     int
         */
        private $center     = null;
    
        /**
         * The content to parse
         *
         * @access  private
         * @var     string
         */
        private $content    = null;
    
        /**
         * Constructor method
         *
         * @access  public
         * @param   string  $content    the content to parse (optional)
         * @param   array   $ads        all advertises to place (optional)
         * @return  object              itself as object
         */
        public function __construct ($content = null, $ads = array())
        {
            if (count($ads)) $this->ads = $ads;
            if ($content) $this->setContent($content);
    
            return $this;
        }
    
        /**
         * Calculates and sets the position behind the </p> element nearest to the center
         *
         * @access  public
         * @return  object              the position behind the </p> element nearest to the center
         */
        public function calcCenter ()
        {
            $content = $this->content;
    
            if (!$content) return $this;
    
            $center = ceil(strlen($content)/2);
    
            $rlpos  = strripos(substr($content, 0, $center), '</p>');
            $rrpos  = stripos($content, '</p>', $center);
    
            $this->center = 4 + ($center-$rlpos <= $rrpos-$center ? $rlpos : $rrpos);
    
            return $this;
        }
    
        /**
         * Places the first ad
         *
         * @access  public
         * @param   string  $ad optional; if not specified, take the internally setted ad
         * @return  object      itself as object
         */
        public function placeFirstAd ($ad = null)
        {
            $ad = $ad ? $ad : $this->ads[0];
            $content = $this->content;
    
            if (!$content || !$ad) return $this;
    
            // the position before and after the first paragraph
            $pos1 = strpos($content, '<p');
            $pos2 = strpos($content, '</p>') + 4;
    
            // place ad
            $content = substr($content, 0, $pos2) . $ad . substr($content, $pos2);
    
            // strip images
            $content = substr($content, 0, $pos1) . preg_replace('#<img(?:\s.*?)?/?>#i', '', substr($content, $pos1, $pos2)) . substr($content, $pos2);
    
            $this->content = $content;
    
            return $this;
        }
    
        /**
         * Places the second ad
         *
         * @access  public
         * @param   string  $ad optional; if not specified, take the internally set ad
         * @return  object      itself as object
         */
        public function placeSecondAd ($ad = null)
        {
            $ad = $ad ? $ad : $this->ads[1];
            $content = $this->content;
    
            if (!$content || !$ad) return $this;
    
            $center = $this->center;
    
            // place ad
            $content = substr($content, 0, $center) . $ad . substr($content, $center);
    
            $this->content = $content;
    
            return $this;
        }
    
        /* Getters */
    
        /**
         * Gets the content in it's current state
         *
         * @access  public
         * @return  string  the content in it's current state
         */
        public function getContent ()
        {
            return $this->content;
        }
    
        /* Setters */
    
        /**
         * Sets the content
         *
         * @access  public
         * @param   string  $content    the content to parse
         * @return  object              itself as object
         */
        public function setContent ($content)
        {
            $this->content = $content;
    
            $this->calcCenter();
    
            return $this;
        }
    
        /**
         * Sets the first ad
         *
         * @access  public
         * @param   string  $ad the ad
         * @return  object      itself as object
         */
        public function setFirstAd ($ad)
        {
            if ($ad) $this->ad[0] = $ad;
    
            return $this;
        }
    
        /**
         * Sets the second ad
         *
         * @access  public
         * @param   string  $ad the ad
         * @return  object      itself as object
         */
        public function setSecondAd ($ad)
        {
            if ($ad) $this->ad[1] = $ad;
    
            return $this;
        }
    }
    

    Anwendungsbeispiel:

    $first_ad   = 'bacon';
    $second_ad  = 'ham';
    
    $content    = apply_filters('the_content', $post->post_content);
    
    $advertiser = new Advertiser($content);
    
    $advertiser->placeFirstAd($first_ad);
    //$advertiser-> placeSecondAd($second_ad);
    
    $advertised_content = $advertiser->getContent();
    

    Sie können placeSecondAd() auskommentieren oder durch Ihre Arbeitsfunktion ersetzen.

    Benutzer-Avatar
    Amir Fo

    Hier ist ein intelligenter Weg:

    $content = "<p>A</p><p>B</p><p>C</p><p>D</p>";
    $pos = 2;
    $content = preg_replace('/<p>/', '<helper>', $content, $pos + 1); //<helper>A</p><helper>B</p><helper>C</p><p>D</p>
    $content = preg_replace('/<helper>/', '<p>', $content, $pos);     //<p>A</p><p>B</p><helper>C</p><p>D</p>
    $content = str_replace("<helper>", "<p>ad</p><p>", $content);     //<p>A</p><p>B</p><p>ad</p><p>C</p><p>D</p>
    

    Hier ist eine vollständige Funktion:

    function insertAd($content, $ad, $pos = 0){
      // $pos = 0 means randomly position in the content
      $count = substr_count($content, "<p>");
      if($count == 0  or $count <= $pos){
        return $content;
      }
      else{
        if($pos == 0){
          $pos = rand (1, $count - 1);
        }
        $content = preg_replace('/<p>/', '<helper>', $content, $pos + 1);
        $content = preg_replace('/<helper>/', '<p>', $content, $pos);
        $content = str_replace('<helper>', $ad . "\n<p>", $content);
        return $content;
      }
    }
    

    Ok, das ist eine Idee, um Sie (möglicherweise) näher an die vollständig programmatische Art und Weise zu bringen, auf die Sie fragen …

    Verwenden Sie einen HTML-DOM-Parser wie z http://simplehtmldom.sourceforge.net/ um jeden Artikel zu analysieren. Auf diese Weise sollten Sie theoretisch in der Lage sein, alle Absatz-Tags auszuwählen und dann die Werbeblöcke basierend auf Ihrer Mathematik zwischen den richtigen einzufügen.

    $html = str_get_html($content);
    $paragraphs_arr = $html->find('p'); //Returns all paragraphs
    $halfway_mark = ceil(count($paragraphs_arr) / 2);
    
    $halfway_paragraph = $paragraphs_arr[$halfway_mark];
    
    // Somewhere here now you just have to figure out how to inject the ad right after the halfway paragraph.
    
    E.g.
    $p_content = $halfway_paragraph->innertext();
    $p_content = $p_content."</p><p><!-- Ad --></p>"; // Force close the tag as we're in the innertext.
    $halfway_paragraph->innertext($p_content);
    

    Kommt das dem, was du vorhast, etwas näher?

    Benutzer-Avatar
    Anjana

    Verwenden

     strip_tags('contnet','like <p>');
    

    • Damit beantwortet sich die Frage wie

      – Pieter Goosen

      23. September 2014 um 11:06 Uhr

    1383230cookie-checkPlatzieren Sie Anzeigen zwischen Nur-Text-Absätzen

    This website is using cookies to improve the user-friendliness. You agree by using the website further.

    Privacy policy