{"id":229355,"date":"2022-11-16T10:37:00","date_gmt":"2022-11-16T07:37:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229355"},"modified":"2022-11-16T19:47:06","modified_gmt":"2022-11-16T16:47:06","slug":"szablony-wordpress-dla-poczatkujacych-html-wywolanie-php","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/szablony-wordpress-dla-poczatkujacych-html-wywolanie-php\/","title":{"rendered":"Szablony WordPress dla pocz\u0105tkuj\u0105cych: HTML Wywo\u0142anie PHP"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/pl\/szablony-wordpress-dla-poczatkujacych-jak-to-jest\/\" title=\"Wczoraj\">Wczoraj<\/a> naszkicowa\u0142em, jak okre\u015bli\u0107, ilu z nas jest prawdopodobnie przyzwyczajonych do pracy z szablonami WordPress.<\/p>\n<p>Chocia\u017c rozdzielenie problem\u00f3w zwi\u0105zanych z CSS i JavaScript jest solidne, szablony s\u0105 problematyczne, gdy jest du\u017co PHP zmieszanego z naszymi znacznikami.<\/p>\n<p>Aby by\u0142o jasne, nie mo\u017cemy pom\u00f3c, ale do\u0142\u0105czamy tagi szablon\u00f3w, poniewa\u017c jest to natura dzia\u0142ania WordPressa i og\u00f3lnych system\u00f3w zarz\u0105dzania tre\u015bci\u0105 opartych na PHP.<\/p>\n<p>Problem pojawia si\u0119 zawsze, gdy pracujemy z szablonami, kt\u00f3re zawieraj\u0105 kod wykonuj\u0105cy bardziej z\u0142o\u017cone wywo\u0142ania r\u00f3\u017cnych interfejs\u00f3w API. Chocia\u017c zademonstrowa\u0142em to za pomoc\u0105 <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a> (i nadal b\u0119d\u0119 to robi\u0107), nie jest to tylko to zapytanie.<\/p>\n<p>W ka\u017cdym razie, co mamy z tym zrobi\u0107?<\/p>\n<h2>Szablony WordPress: kiedy HTML wywo\u0142uje PHP<\/h2>\n<p>Po pierwsze, wa\u017cne jest, aby zastanowi\u0107 si\u0119, dlaczego mieszanie tak du\u017cej ilo\u015bci PHP i znacznik\u00f3w jest z\u0142ym pomys\u0142em.<\/p>\n<p>\u0141atwo powiedzie\u0107, \u017ce utrudnia to utrzymanie kodu w stanie <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">suchym<\/a> (i jest w tym prawda), ale co, je\u015bli raz u\u017cyjemy pojedynczego zapytania lub pojedynczego bloku kodu? Czy w takim razie bycie SUCHE jest naprawd\u0119 takie wa\u017cne?<\/p>\n<p>Aby by\u0142o jasne, tak, my\u015bl\u0119, \u017ce jest to wa\u017cne ze wzgl\u0119du na utrzymanie kodu w stanie suchym, ale je\u015bli zamierzamy u\u017cy\u0107 wywo\u0142ania tylko raz, nadal uwa\u017cam, \u017ce ma to znaczenie, je\u015bli nie z innego powodu ni\u017c utrzymanie kodu szablonu tak czystego, jak mo\u017cliwy.<\/p>\n<p>Pomy\u015bl o tym w ten spos\u00f3b: Za ka\u017cdym razem, gdy chcemy wy\u015bwietli\u0107 tytu\u0142, tre\u015b\u0107 i autora posta, wystarczy wywo\u0142a\u0107 trzy funkcje:<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/the_title\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tytu\u0142();<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/the_content\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Zawarto\u015b\u0107();<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/the_author_meta\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">meta_autora();<\/a><\/li>\n<\/ul>\n<p>Wyobra\u017a sobie wi\u0119c adaptacj\u0119 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2c02b22272f645076f7f735bd61a4034#file-00-content-container-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">poni\u017cszego kodu<\/a> (o czym przyjrzeli\u015bmy si\u0119 w poprzednim po\u015bcie):<\/p>\n<pre><code>&lt;div id=\"content-container\"&gt;\n\n  &lt;p&gt;\n    Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! \n    Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that \n    thing away! You're going to get us all killed.\n  &lt;\/p&gt;\n\n  &lt;h2&gt;List of Post Titles For Acme Post Type&lt;\/h2&gt;\n  &lt;?php\n  $args = array(\n    'post_status'    =&gt; 'publish',\n    'post_type'      =&gt; 'acme',\n    'posts_per_page' =&gt; '10'\n  );\n  $custom_query = new WP_Query( $args );\n\n  if ($custom_query-&gt;have_posts()) {\n    echo '&lt;ul&gt;';\n    while ($custom_query-&gt;have_posts()) {\n      $custom_query-&gt;the_post();\n      echo '&lt;li&gt;'. get_the_title(). '&lt;\/li&gt;';\n    }\n    echo '&lt;\/ul&gt;';\n    wp_reset_postdata();\n  }\n  ?&gt;\n\n  &lt;p&gt;\n    Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not \n    going to take them long to figure out what happened to us. It could be worst... It's worst. \n    There's something alive in here! That's your imagination. Something just moves past my leg! \n    Look! Did you see that? What? Help!\n  &lt;\/p&gt;\n\n&lt;\/div&gt;&lt;!-- #content-container --&gt;<\/code><\/pre>\n<p>Aby wygl\u0105da\u0107 mniej wi\u0119cej tak:<\/p>\n<pre><code>&lt;div id=\"content-container\"&gt;\n\n  &lt;p&gt;\n    Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! \n    Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that \n    thing away! You're going to get us all killed.\n  &lt;\/p&gt;\n\n  &lt;h2&gt;List of Post Titles For Acme Post Type&lt;\/h2&gt;\n  &lt;?php acme_get_titles(); ?&gt;\n\n  &lt;p&gt;\n    Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not \n    going to take them long to figure out what happened to us. It could be worst... It's worst. \n    There's something alive in here! That's your imagination. Something just moves past my leg! \n    Look! Did you see that? What? Help!\n  &lt;\/p&gt;\n\n&lt;\/div&gt;&lt;!-- #content-container --&gt;<\/code><\/pre>\n<p>Du\u017co czystszy, prawda? Ale w tym, co widzisz, jest co\u015b wi\u0119cej. W szczeg\u00f3lno\u015bci, je\u015bli zamierzamy pracowa\u0107 z HTML za kulisami, musimy upewni\u0107 si\u0119, \u017ce <a href=\"https:\/\/gist.github.com\/tommcfarlin\/2c02b22272f645076f7f735bd61a4034#file-02-acme-get-titles-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">prawid\u0142owo<\/a> go oczyszczamy, u\u017cywaj\u0105c czego\u015b takiego jak <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_kses\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_kses<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Runs a custom query to get the most recent ten published articles of the\n * acme post type and then prints a sanitized list of the the titles.\n *\/\nfunction acme_get_titles()\n{\n\n  $args = array(\n    'post_status'    =&gt; 'publish',\n    'post_type'      =&gt; 'acme',\n    'posts_per_page' =&gt; '10'\n  );\n  $custom_query = new WP_Query( $args );\n\n  if ($custom_query-&gt;have_posts()) {\n    $html = '&lt;ul&gt;';\n    while ($custom_query-&gt;have_posts()) {\n      $custom_query-&gt;the_post();\n      $html .= '&lt;li&gt;'. get_the_title(). '&lt;\/li&gt;';\n    }\n    $html .= '&lt;\/ul&gt;';\n    wp_reset_postdata();\n  }\n\n  echo _acme_sanitize_titles($html);\n}\n\n\/**\n * Uses the WordPress wp_kses() API to sanitize and echo the incoming markup.\n *\n * @param string $html The HTML to sanitize.\n *\/\nfunction _acme_sanitize_titles($html) {\n\n  if(empty($html)) {\n    echo $html;\n  }\n\n  echo wp_kses(\n    $html,\n    array(\n      'ul' =&gt; array(),\n      'li' =&gt; array(),\n    );\n  );\n}<\/code><\/pre>\n<p>Obecnie pomys\u0142 przeniesienia kodu HTML z PHP do szablonu WordPress jest uwa\u017cany przez niekt\u00f3rych programist\u00f3w za anty-wzorzec. I to nie jest bez zas\u0142ug.<\/p>\n<p>W trakcie tej serii nale\u017cy jednak zachowa\u0107 r\u00f3wnowag\u0119: chodzi o wprowadzenie, jak ludzie cz\u0119sto prezentuj\u0105 informacje, a nast\u0119pnie o ich posprz\u0105tanie.<\/p>\n<p>Id\u0105c dalej, mo\u017cliwe jest \u2013 i wcale nie jest to z\u0142y pomys\u0142 \u2013 oddzielenie funkcji WP_Query jeszcze bardziej, aby u\u017cy\u0107 <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_template_part\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_template_part<\/a>. Niesie to za sob\u0105 troch\u0119 czystszego kodu, ale wymaga r\u00f3wnie\u017c dog\u0142\u0119bnego przyjrzenia si\u0119 tej funkcji.<\/p>\n<p>I to jest co\u015b, czego nie interesuje mnie w tej konkretnej serii.<\/p>\n<h2>Jak powinni\u015bmy to wizualizowa\u0107?<\/h2>\n<p>Je\u015bli chodzi o szablonowanie, mo\u017cemy to konceptualizowa\u0107 na kilka r\u00f3\u017cnych sposob\u00f3w.<\/p>\n<ol>\n<li>W niekt\u00f3rych j\u0119zykach szablon\u00f3w warto pomy\u015ble\u0107 o wstrzykiwaniu informacji do szablonu przez PHP,<\/li>\n<li>W powy\u017cszym przyk\u0142adzie warto pomy\u015ble\u0107 o pliku szablonu \u017c\u0105daj\u0105cym informacji ze skryptu PHP.<\/li>\n<\/ol>\n<p>W powy\u017cszym przyk\u0142adzie mamy funkcj\u0119 umieszczon\u0105 na przyk\u0142ad w <strong>functions.php<\/strong> i wywo\u0142uj\u0105cy j\u0105 plik szablonu:<\/p>\n<p>Ma sens? Ale spos\u00f3b, w jaki to si\u0119 robi \u2013 pod wzgl\u0119dem kodu stoj\u0105cego za tym pojedynczym wywo\u0142aniem funkcji \u2013 jest zadowalaj\u0105cy dla samego posta.<\/p>\n<p>I o tym b\u0119d\u0119 si\u0119 przygl\u0105da\u0142 w nast\u0119pnym po\u015bcie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zrozumienie, w jaki spos\u00f3b szablony WordPress odwo\u0142uj\u0105 si\u0119 do plik\u00f3w PHP, mo\u017ce pom\u00f3c nam napisa\u0107 kod DRY, ale tak\u017ce kod, kt\u00f3ry jest \u0142atwiejszy do odczytania i prostszy w utrzymaniu.<\/p>\n","protected":false},"author":1,"featured_media":223984,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[919,897,836,845,866],"tags":[1169],"class_list":["post-229355","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-inny","category-kod","category-przewodnik-dla-poczatkujacych","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229355","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=229355"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229355\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223984"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}