Wsparcie » Zaawansowane » Shortcode

  • Witajcie,

    mam mały problem. Napisałem sobie mały skrypcik, który umieściłem w pliku bufor.php (dane podmieniane są w locie, includuje plik w header.php) – wiem, że to niebezpieczne, ale znacznie przyspiesza mi to pracę.

    Działanie skryptu polega na tym, że przechodzi po danej stronie, jeżeli znajdzie w kolumnie A „ABC”, to w kolumnie B – wrzuci mi to co zdeklarowałem w tablicy. Skrypt działa, wszystko się ładnie wyszukuje i podmienia.

    Jednak gdy wrzucam już shortcode np. [offers url=’/laptop/’] do tablicy, niestety skrypt wrzuca to jako string, a shortcode się nie odpala.

    Ktoś ma jakiś pomysł jak zrobić, aby dany shortcode zaczął działać? Gdy wrzucę ten sam shortcode z poziomu WP (strona/wpis) – wszystko generuje się jak powinno.

Viewing 15 replies - 1 through 15 (of 19 total)
  • Moderator amistad18

    (@amistad18)

    do_shortcode()

    Więcej bez pokazania kodu nie pomożemy.

    Thread Starter damian0021

    (@damian0021)

    function w_callback($b)
    
    // tablica do podmian
    $name_and_link_arr = array(
    	'abc' => 'cztery hb',
    	'laptop' => '[offers url=’/laptop/’] '
    );
    
    preg_match_all('~<td class=".*(?=\sbulb")\sbulb">([^<]*)</td>\s*<td class=".*(?=\soffer")\soffer">([^<]*)</td>~Usmi', $b, $matches);
    
    $matches_len = count($matches[0]);
    
    for ($i = 0; $i <= $matches_len; $i++) { 
    	if (array_key_exists($matches[1][$i], $name_and_link_arr)) {
    		$b = preg_replace('~link~Usmi', $name_and_link_arr[$matches[1][$i]], $b,1);
            
    
    return $b;
    Moderator amistad18

    (@amistad18)

    To jest kod z bufor.php? Chciał bym zobaczyć bufor.php, header.php i kod z użyciem tej funkcji, te kawałki z niedziałającym shortcodem też.

    Rozumiem że skrypt podmienia linki z każdym odświeżeniem strony? Czy napisałeś sobie skrypt do jednorazowej aktualizacji treści? Masz jakiegoś linka gdzie to działa online?

    Thread Starter damian0021

    (@damian0021)

    Proszę bardzo:

    plik bufor.php :

    <?php
    
    function w_callback($b){
    
    // tablica do podmian
    $name_and_link_arr = array(
    	'HB4' => 'cztery hb',
    	'H7' => '[nokaut-offers-box url=\'/hb4/\' template=\'list\' limit=\'10\' render_type=\'inline\']'
    );
    
        
    // złapanie dopasowań
    preg_match_all('~<td class=".*(?=\sbulb")\sbulb">([^<]*)</td>\s*<td class=".*(?=\soffer")\soffer">([^<]*)</td>~Usmi', $b, $matches);
    
    // wyliczenie długości tablicy
    $matches_len = count($matches[0]);
    
    // podmiany w pętli
    for ($i = 0; $i <= $matches_len; $i++) { 
    	if (array_key_exists($matches[1][$i], $name_and_link_arr)) {
    		$b = preg_replace('~ytaus~Usmi', $name_and_link_arr[$matches[1][$i]], $b,1);
            
    
    return $b;
    }
    }
    }
    if(stristr($_SERVER['REQUEST_URI'],'wp-admin')===false) ob_start('w_callback');
    ?>

    plik header.php rozpoczyna się:

    <?php
    @include_once('opta.php'); 

    Online wersja testowa: http://seowars.cba.pl/

    Gdy będzie trzeba podam dane do FTP.

    Thread Starter damian0021

    (@damian0021)

    Proszę bardzo:

    plik bufor.php :

    <?php
    
    function w_callback($b){
    
    // tablica do podmian
    $name_and_link_arr = array(
    	'HB4' => 'cztery hb',
    	'H7' => '[nokaut-offers-box url=\'/hb4/\' template=\'list\' limit=\'10\' render_type=\'inline\']'
    );
    
        
    // złapanie dopasowań
    preg_match_all('~<td class=".*(?=\sbulb")\sbulb">([^<]*)</td>\s*<td class=".*(?=\soffer")\soffer">([^<]*)</td>~Usmi', $b, $matches);
    
    // wyliczenie długości tablicy
    $matches_len = count($matches[0]);
    
    // podmiany w pętli
    for ($i = 0; $i <= $matches_len; $i++) { 
    	if (array_key_exists($matches[1][$i], $name_and_link_arr)) {
    		$b = preg_replace('~ytaus~Usmi', $name_and_link_arr[$matches[1][$i]], $b,1);
            
    
    return $b;
    }
    }
    }
    if(stristr($_SERVER['REQUEST_URI'],'wp-admin')===false) ob_start('w_callback');
    ?>

    plik header.php rozpoczyna się:

    <?php
    @include_once('opta.php'); 

    Online wersja testowa: http://seowars.cba.pl/

    Gdy będzie trzeba podam dane do FTP.

    • Ta odpowiedź została zmodyfikowana 5 years, 2 months temu przez amistad18.
    Thread Starter damian0021

    (@damian0021)

    Kod z pliku bufor.php masz powyżej,
    Kod pliku header.php rozpoczyna się:

    <?php
    @include_once('bufor.php'); 

    Shortcode jest shortcodem PP Nokaut.

    Tutaj masz online (wersja testowa) : seowars.cba.pl

    • Ta odpowiedź została zmodyfikowana 5 years, 2 months temu przez amistad18.
    Moderator amistad18

    (@amistad18)

    Czyli dobrze rozumiem że całą treść strony jedziesz preg_match_all()?

    To nie ma szans zadziałać, gdyż Ty otrzymujesz już wygenerowany przez PHPa kod HTML, do którego próbujesz dodać shortcoda, którego PHP by pewnie i tak już poprawnie nie wygenerował – ale nawet gdyby, to jest już po fakcie.

    Zamiast:
    $b = preg_replace('~ytaus~Usmi', $name_and_link_arr[$matches[1][$i]], $b,1);

    Mógł byś spróbować coś w stylu:

    $shortcode = do_shortcode( $name_and_link_arr[$matches[1][$i]], false );
    $b = preg_replace('~ytaus~Usmi', $shortcode, $b,1);

    do_shortcode jak wrzucisz zwykłego stringa zwróci Ci go dalej jako string, ale shortcoda powinien wygenerować. Jednakże to raczej nie jest dobry sposób.

    Lektura:
    https://codex.wordpress.org/Plugin_API#Filters

    Jak wolisz coś po polsku to po prostu pogooglaj WordPress filtry, najlepiej coś z przykładami, wtedy od razu skumasz jakie filtry są fajne i że są idealne pod Twoje potrzeby.

    https://codex.wordpress.org/Plugin_API/Filter_Reference/the_content

    Dlatego kombinujesz coś takiego:

    
    function filter_the_content_callback( $content ){
    
    // tablica do podmian
    .
    .
    .
    $content = preg_replace('~ytaus~Usmi', $name_and_link_arr[$matches[1][$i]], $b,1);
    
    return $content ;
    
    }
    
    add_filter ( 'the_content', 'filter_the_content_callback', 10 );

    Podpinasz się pod the_content, bo widzę że i tak filtrujesz tak naprawdę treść wpisów/stron. Pamiętaj aby jako priorytet dać coś mniejszego niż 11, gdyż domyślnie do_shortcode jest ustawione na the_content z priorytetem 11, więc Ty swoje shortcody musisz dodać szybciej aby były wygenerowane, albo robisz coś w ten deseń:

    remove_filter( 'the_content', 'do_shortcode', 11 );
    add_filter ( 'the_content', 'filter_the_content_callback', 20 );
    add_filter( 'the_content', 'do_shortcode', 30 );

    Cały kod wrzucasz albo do wtyki, i zapominasz o pliku bufor.php i jego includowaniu, wystarczy włączyć wtykę.

    • Ta odpowiedź została zmodyfikowana 5 years, 2 months temu przez amistad18.
    • Ta odpowiedź została zmodyfikowana 5 years, 2 months temu przez amistad18.
    Thread Starter damian0021

    (@damian0021)

    To już chyba za gruby temat dla mnie, czy gdybym dał Ci dostepy do FTP’a, zerknąłbyś mi na to?

    Moderator amistad18

    (@amistad18)

    Jaki gruby temat, sam napisałeś kod z bufor.php? Wystarczy że to przerobisz wedle mojego kodu, wrzucisz do plugins, doklejisz 5 link nagłówka dla wtyczki i gotowe.

    Thread Starter damian0021

    (@damian0021)

    No to tak, rozumiem, że to ma wyglądać tak:

    function filter_the_content_callback( $content ){
    // tablica do podmian
    $name_and_link_arr = array(
        'HB4' => 'cztery hb',
        'H7' => '[nokaut-offers-box url=\'/oswietlenie-samochodu/produkt:żarówka-H1--najczesciej-oferowane.html\' template=\'box\' limit=\'3\' render_type=\'inline\']'
    );
    
        
    // złapanie dopasowań
    preg_match_all('~<td class=".*(?=\sbulb")\sbulb">([^<]*)</td>\s*<td class=".*(?=\soffer")\soffer">([^<]*)</td>~Usmi', $content, $matches);
    
    // wyliczenie długości tablicy
    $matches_len = count($matches[0]);
    
    $content = preg_replace('~ytaus~Usmi', $name_and_link_arr[$matches[1][$i]], $content,1);
    
    return $content ;}
    remove_filter( 'the_content', 'do_shortcode', 11 ); 
    add_filter ( 'the_content', 'filter_the_content_callback', 20 ); 
    add_filter( 'the_content', 'do_shortcode', 30 ); 

    Jeżeli tak to niestety nie działa (ale coś się dzieje). Kod dodaje w pliku functions.php lub w pliku nokaut-offers-box/nokaut-offers-box.php odpowiadający za wtyczkę.

    Gdy wrzucam kod i odświeżę stronę w polu gdzie było H6 -> ytaus -> znika napis 'ytaus’ i zostaje puste pole.

    A czy wyrażenie preg_match_all łapie dobrze, tak wygląda kod :

    <td class="light-main-bulb bulb">H6</td>
    		<td  class="light-main-bulb-offer offer">ytaus</td>

    W każdej innej klasie powtarza się 'bulb’ 'offer’.

    • Ta odpowiedź została zmodyfikowana 5 years, 2 months temu przez damian0021.
    Thread Starter damian0021

    (@damian0021)

    Dobra, coś tam działa:

    Mój kod to:

    function filter_the_content_callback( $content ){
    // tablica do podmian
    $name_and_link_arr = array(
        'H2' => '[nokaut-offers-box url=\'/sprzet-agd\' template=\'box\' limit=\'3\' render_type=\'inline\']',
        'H3' => '[nokaut-offers-box url=\'/wyciskarki/\' template=\'box\' limit=\'3\' render_type=\'inline\']',
    );
    // złapanie dopasowań
    preg_match_all('~<td class=".*(?=\sbulb")\sbulb">([^<]*)</td>\s*<td class=".*(?=\soffer")\soffer">([^<]*)</td>~Usmi', $content, $matches);
    // wyliczenie długości tablicy
    $matches_len = count($matches[0]);
    for ($i = 0; $i <= $matches_len; $i++) { 
        if (array_key_exists($matches[1][$i], $name_and_link_arr))
    $content = preg_replace('~ytaus~Usmi', $name_and_link_arr[$matches[1][$i]], $content,1);
    return $content ;
    }
    }
    remove_filter( 'the_content', 'do_shortcode', 11 ); 
    add_filter ( 'the_content', 'filter_the_content_callback', 20 ); 
    add_filter( 'the_content', 'do_shortcode', 30 );

    Wrzucam do na samym górze w pliku odpowiadającym za wtyczkę, zresztą nie ma znaczenia gdy wrzucam go do functions.php też działa. Ale pojawił się kolejny problem, a więc – w momencie gdy w tabeli A jest => H1 – podmienia mi wszytko na shortcode’a, gdy w tabeli nie ma 'H1′ to pozostaje 'ytaus’ bez podmiany.

    Moderator amistad18

    (@amistad18)

    remove_filter( 'the_content', 'do_shortcode', 11 ); 
    add_filter ( 'the_content', 'filter_the_content_callback', 20 ); 
    add_filter( 'the_content', 'do_shortcode', 30 );

    To był tylko przykład jak byś chciał albo musiał kombinować z priorytetami, jeśli tego nie potrzebujesz to zostaw tylko środkową linijkę.

    Niezbyt rozumiem co masz teraz za problem z tym H1, tym bardziej że w tablicy masz zdefiniowane tylko H2 i H3. Jesteś pewien że preg_match_all() dobrze wszystko łapie?

    A tak ogólnie, to po co to robisz? Czemu nie możesz dodać shortcode od razu w treści?

    btw. jeśli nie chcesz swojej wtyki utworzyć to już lepiej zostaw ten kod w functions.php (jeśli to Twój motyw, bo inaczej z aktualizacją zniknie, więc albo wtyka albo child theme – choć to jest funkcjonalność, więc miejsce tego kodu jest we wtyce a nie motywie).

    Thread Starter damian0021

    (@damian0021)

    Mój kod wygląda tak:

    function filter_the_content_callback( $content ){
    // tablica do podmian
    $name_and_link_arr = array(
        'H1' => '[nokaut-offers-box url=\'/sprzet-agd\' template=\'box\' limit=\'3\' render_type=\'inline\']',
        'H3' => '[nokaut-offers-box url=\'/wyciskarki/\' template=\'box\' limit=\'3\' render_type=\'inline\']',
    );
    // złapanie dopasowań
    preg_match_all('~<td class=".*(?=\sbulb")\sbulb">([^<]*)</td>\s*<td class=".*(?=\soffer")\soffer">([^<]*)</td>~Usmi', $content, $matches);
    // wyliczenie długości tablicy
    $matches_len = count($matches[0]);
    for ($i = 0; $i <= $matches_len; $i++) { 
        if (array_key_exists($matches[1][$i], $name_and_link_arr))
    $content = preg_replace('~ytaus~Usmi', $name_and_link_arr[$matches[1][$i]], $content,1);}
    return $content ;
    
    }
    
    add_filter ( 'the_content', 'filter_the_content_callback', 20 ); 

    Podmienia mi tylko 1 <td> w tabeli i tyle, do kolejnego wrzuca shortcode’a, ale go nie podmienia.

    Jak daje na końcu:

    remove_filter( 'the_content', 'do_shortcode', 11 ); 
    add_filter ( 'the_content', 'filter_the_content_callback', 20 ); 
    add_filter( 'the_content', 'do_shortcode', 30 );

    To w momencie gdy :

    H1 -> ABC
    H2 -> CBA

    W każdym przypadku pobiera wartość H1 i wrzuca to co ma podmienić z H1.

    Thread Starter damian0021

    (@damian0021)

    WP_debug wrzycua mi takie coś :

    Notice: Undefined offset: 0 in /home/wp-content/themes/kale/functions.php on line 52

    Linia 52 to :

    if (array_key_exists($matches[1][$i], $name_and_link_arr))

    Moderator amistad18

    (@amistad18)

    A jeśli wrzucisz shortcody nokautu w treść strony, więcej niż jeden, to się wszystkie poprawnie wygenerują?

    I nadal nie wiem dlaczego tak kombinujesz z tym tematem.

Viewing 15 replies - 1 through 15 (of 19 total)
  • Temat ‘Shortcode’ jest zamknięty na nowe odpowiedzi.