Wsparcie » Zaawansowane » Shortcode
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.
-
Więcej bez pokazania kodu nie pomożemy.
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;
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?
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.
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 6 years, 9 months temu przez amistad18.
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 6 years, 9 months temu przez 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#FiltersJak 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ę.
To już chyba za gruby temat dla mnie, czy gdybym dał Ci dostepy do FTP’a, zerknąłbyś mi na to?
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.
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 6 years, 9 months temu przez 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.
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).
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 -> CBAW każdym przypadku pobiera wartość H1 i wrzuca to co ma podmienić z H1.
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))
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.
- Temat ‘Shortcode’ jest zamknięty na nowe odpowiedzi.