2012-05-27 22 views
10

Używam bezpośredni związek z popup dla przycisku akcji na Twitterze: <a href="https://twitter.com/intent/tweet?url=<?php echo urlencode(get_permalink());?>&amp;text=<?php echo get_the_title(); ?>&amp;via=username" target="_blank"get_the_title kodowanie() dla Twitter Udostępnij URL

Z wszystkich szalonych multimedialnych wtyczek społecznościowych tam, jest to najprostszy i najbardziej bezpośredni sposób, w jaki mogę zaimplementować przycisk udostępniania.

Jeśli jednak w tytule jest &, tytuł przerwie tekst, który ma pokazać status. Rozumiem, że musisz mieć tytuł urlencode(), ale kiedy to zrobię, wyświetla on znaki specjalne w komunikacie o stanie.

Ponieważ nie potrzebujemy + dla [space] w Twitter dzielić teraz muszę wymienić żadnych & „s ze &amp;. Jednak wydaje się, że nie działa z str_replace(). Z pewnych przyczyn wyprowadza znaki specjalne HTML. Robienie czegoś takiego jak <?php echo str_replace('&', '&amp;', urldecode(get_the_title())); ?> też nie działa.

+0

Co masz na myśli przez "ale kiedy to robię, wyświetla specjalne znaki w komunikacie o stanie"? Jaki jest ostateczny HTML, który wyprowadzasz i jak wyświetla się na Twitterze? – deceze

+0

Powoduje wyświetlenie znaków specjalnych w aktualnym komunikacie o stanie. Możesz zobaczyć na przykład tutaj: https://twitter.com/intent/tweet?url=http%3A%2F%2Fgoogle.com&text=%26%238216%3BMr.+Blah+%26%23038%3B+Mrs .+ Blah & via = nazwa użytkownika – AAA

Odpowiedz

41

& ma specjalne znaczenie w adresach URL, aby oddzielić kilka parametrów. Jeśli Twój adres URL to ...a&b..., to nie reprezentuje tekstu "a & b", reprezentuje dwa oddzielne parametry. Aby tego uniknąć, musisz urlencode tekst, który zamienia & w %26.

Kodowanie & do &amp; jest konieczne tylko dla & znaków w HTML, który nie powinien mieć w swoim tekście, ponieważ wszystkie & s zostają zastąpione przez %26.

Nie znam zawiłości Wordpress, ale myślę, że get_the_title() zwraca wartość, która jest już uciekła HTML. Oznacza to, że zawiera ona &amp; zamiast &, więc jest to wartość wysyłana do Twittera, jeśli wyślesz ją właśnie tak. To, czego potrzebujesz, to uzyskać tekst bez elementów HTML, tzn. Musisz go zdekodować, aby zmienić &amp; z powrotem na rzeczywistą wartość &. Dekodowana przez HTML wartość musi być zakodowana za pomocą adresu URL, aby nie zepsuć składni adresu URL.

Kładzenie to wszystko razem, to powinno nadzieją zrobić:

echo urlencode(html_entity_decode(get_the_title(), ENT_COMPAT, 'UTF-8')); 

Mogą istnieć inne sposoby, aby zdobyć tytuł oryginalny bez podmiotów HTML bezpośrednio z WordPress bez konieczności zrobić skomplikowaną html_entity_decode taniec, ale znowu, Nie wiem zbyt wiele o Wordpress.


PS: Skoro jesteś wyprowadzanie tego adresu URL w kontekście HTML, ty powinny HTML zakodować URL ponownie, aby upewnić się, że nie łamie swoją składni HTML. To głównie dla akademickiej kompletności, ale urlencode() nie powinien zwracać niczego, co może złamać składnię HTML. Ale tylko dla pedantycznej kompletności, tutaj:

echo htmlspecialchars(urlencode(html_entity_decode(get_the_title(), ENT_COMPAT, 'UTF-8')), ENT_COMPAT, 'UTF-8'); 
+0

Rozumiem, dlatego go najpierw zakodowałem, ale problem polega na tym, że kiedy koduję cały tekst, specjalne znaki HTML pokazują w aktualnym statusie. Zobacz na przykład tutaj: https://twitter.com/intent/tweet?url=http%3A%2F%2Fgoogle.com&text=%26%238216%3BMr.+Blah+%26%23038%3B+Mrs.+Blah&via= nazwa użytkownika – AAA

+0

Dlaczego w adresie URL masz specjalne znaki HTML? Znowu, jaki jest rzeczywisty HTML, który jest wysyłany? – deceze

+0

Używam 'get_the_title()', dzięki czemu mogę coś Tweetuj z 'text = get_the_title()'. W tytułach postu czasami pojawiają się '' lub '&', co nie jest niczym niezwykłym. Rzeczywisty HTML, który jest wyprowadzany, jest zakodowanym 'get_the_title()', ale jak już wcześniej wspomniałem, problem polega na tym, że Twitter wypisuje znaki specjalne w statusie. Zrobiłem Google ten problem i nikt nie wydaje się mieć jednoznaczne rozwiązanie, ponieważ jest to znany problem najwyraźniej. ^ Po prostu pokazałem ci rzeczywisty wynik HTML. – AAA