{"id":229193,"date":"2022-11-12T12:31:00","date_gmt":"2022-11-12T09:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229193"},"modified":"2022-11-09T05:53:56","modified_gmt":"2022-11-09T02:53:56","slug":"aktualizacja-kolejnych-wydarzen-we-wpisach-w-kalendarzu-wydarzen","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/aktualizacja-kolejnych-wydarzen-we-wpisach-w-kalendarzu-wydarzen\/","title":{"rendered":"Aktualizacja kolejnych wydarze\u0144 we wpisach w kalendarzu wydarze\u0144"},"content":{"rendered":"\n<p>To naprawd\u0119 zniuansowany przypadek, ale pomy\u015bla\u0142em, \u017ce warto spr\u00f3bowa\u0107 uog\u00f3lni\u0107 post dla ka\u017cdego, kto mo\u017ce pracowa\u0107 z przysz\u0142ymi wydarzeniami z Kalendarzem wydarze\u0144 Modern Tribe.<\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce konfigurujesz wydarzenie cykliczne i w jego tre\u015bci (a w\u0142a\u015bciwie w <strong>post_content<\/strong>) chcesz powiedzie\u0107 co\u015b takiego:<\/p>\n<blockquote>\n<p>Min\u0119\u0142o N lat od [tego wydarzenia].<\/p>\n<\/blockquote>\n<p>Rzecz w tym, \u017ce ka\u017cde kolejne wydarzenie b\u0119dzie oczywi\u015bcie o rok d\u0142u\u017csze ni\u017c poprzednie. Nie mo\u017cna wi\u0119c na sta\u0142e zakodowa\u0107 warto\u015bci w wydarzeniach bez umieszczania jej w tre\u015bci wpisu ka\u017cdego wydarzenia.<\/p>\n<p>Wi\u0119c jaki jest jeden spos\u00f3b na poradzenie sobie z tym?<\/p>\n<h2>Aktualizacja kolejnych wydarze\u0144<\/h2>\n<p>Podobnie jak w przypadku wi\u0119kszo\u015bci rzeczy, b\u0119dzie to zale\u017ce\u0107 od konfiguracji bazy kodu, ale zak\u0142adaj\u0105c, \u017ce pracujesz ze zdarzeniami serii, nie jest to takie z\u0142e.<\/p>\n<p>W tym po\u015bcie zak\u0142adam:<\/p>\n<ol>\n<li>masz wydarzenia ustawione w taki spos\u00f3b, \u017ce masz pierwsze wydarzenie z serii, a potem masz kolejne wydarzenia),<\/li>\n<li>nie masz nic przeciwko uruchamianiu podstawowych zapyta\u0144 przy u\u017cyciu <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a> ,<\/li>\n<li>znasz si\u0119 na podstawowych wyra\u017ceniach regularnych,<\/li>\n<li>znasz <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/wp_update_post\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_update_post<\/a><\/li>\n<\/ol>\n<p>Og\u00f3lny proces, dzi\u0119ki kt\u00f3remu mo\u017cesz zaktualizowa\u0107 ka\u017cde zdarzenie, aby odzwierciedla\u0142o odpowiedni\u0105 liczb\u0119 lat w ramach <strong>post_content<\/strong>, b\u0119dzie wygl\u0105da\u0142 mniej wi\u0119cej tak:<\/p>\n<ol>\n<li>korzystaj\u0105c z pierwszego wydarzenia z serii, znajd\u017a wszystkie kolejne posty,<\/li>\n<li>zlokalizuj numer w <strong>post_content<\/strong> i zwi\u0119ksz go o jeden,<\/li>\n<li>zaktualizuj post.<\/li>\n<\/ol>\n<p>Ca\u0142kiem proste, prawda? Oto jak to zrobi\u0107.<\/p>\n<h3>1 Znajd\u017a kolejne wydarzenia<\/h3>\n<p>Aby aktualizowa\u0107 kolejne wydarzenia, wa\u017cne jest posiadanie identyfikatora wydarzenia g\u0142\u00f3wnego. Zwykle jest to \u0142atwe do uzyskania, je\u015bli wydarzenie zosta\u0142o ju\u017c utworzone programowo, poniewa\u017c <a href=\"https:\/\/theeventscalendar.com\/function\/tribe_create_event\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tribe_create_event<\/a> zwraca identyfikator posta.<\/p>\n<p>W przeciwnym razie mo\u017cesz na przyk\u0142ad znale\u017a\u0107 post po tytule lub co\u015b podobnego. A kiedy ju\u017c masz ten post, mo\u017cesz pobra\u0107 jego identyfikator.<\/p>\n<p>Gdy sko\u0144czysz, napisz szybkie zapytanie, aby pobra\u0107 wszystkie posty z pocz\u0105tkowym identyfikatorem posta <a href=\"https:\/\/gist.github.com\/tommcfarlin\/db581f4871687c7a11c514a47aa6f618#file-00-find-all-events-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jako nadrz\u0119dnym<\/a> :<\/p>\n<pre><code>&lt;?php\n\nprivate function find_all_events( $event_id) {\n\n  global $wpdb;\n  $events = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\"\n      SELECT ID, post_content\n      FROM   $wpdb-&gt;posts\n      WHERE  post_parent = '%d'\n      AND    post_status = 'publish'\n    \", $event_id),\n    ARRAY_A\n  );\n\n  return $events;\n}<\/code><\/pre>\n<p>Oczywi\u015bcie wol\u0119 umie\u015bci\u0107 to w jego funkcji, aby m\u00f3c wywo\u0142ywa\u0107 go w wielu miejscach w aplikacji, debugowa\u0107 go w razie potrzeby i izolowa\u0107 jego odpowiedzialno\u015b\u0107.<\/p>\n<p>Mo\u017cesz chcie\u0107 zwr\u00f3ci\u0107 wyniki jako kolekcj\u0119 obiekt\u00f3w lub doda\u0107 wi\u0119cej kwalifikator\u00f3w do zapytania, aby ograniczy\u0107 typ zwracanych wynik\u00f3w. Niezale\u017cnie od tego, g\u0142\u00f3wnym wnioskiem z tego kodu jest to, \u017ce pobierasz <strong>identyfikatory<\/strong> i <strong>post_content<\/strong> wszystkich kolejnych post\u00f3w w serii opartej na identyfikatorze pocz\u0105tkowego wydarzenia.<\/p>\n<h3>2 Zaktualizuj zawarto\u015b\u0107 posta<\/h3>\n<p>Po zwr\u00f3ceniu zdarze\u0144 mo\u017cna skonfigurowa\u0107 p\u0119tl\u0119, aby przej\u015b\u0107 przez nie. W zale\u017cno\u015bci od tego, jak zdefiniujesz p\u0119tl\u0119, okre\u015bli to, jak ustawisz licznik, ale jednym z najbardziej podstawowych sposob\u00f3w, aby to zrobi\u0107, jest:<\/p>\n<ol>\n<li>zdefiniowa\u0107 warto\u015b\u0107, zaczynaj\u0105c od jednego, kt\u00f3r\u0105 mo\u017cesz dodawa\u0107 i zwi\u0119ksza\u0107 podczas ka\u017cdej iteracji,<\/li>\n<li>dodaj to do cyfry znalezionej w po\u015bcie.<\/li>\n<\/ol>\n<p>Je\u015bli wi\u0119c u\u017cyjesz\u00a0 p\u0119tli <strong>foreach<\/strong>, kod mo\u017ce wygl\u0105da\u0107 mniej wi\u0119cej <a href=\"https:\/\/gist.github.com\/tommcfarlin\/db581f4871687c7a11c514a47aa6f618#file-01-update-future-events-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/a> :<\/p>\n<pre><code>&lt;?php\n\npublic function update_future_events( $event_id) {\n\n  $events = $this-&gt;find_all_events( $event_id );\n\n  $iteration = 1;\n  foreach ($events as $event) {\n\n    preg_match_all( '\/(d+)\/', $anniversary['post_content'], $matches );\n\n    $original_year = $matches[0];\n    $original_year = intval( $original_year[0] );\n    $new_year      = ($original_year + $iteration );\n    $iteration++;\n\n    \/\/ See forth-coming gist.\n  }\n}<\/code><\/pre>\n<p>B\u0119dzie to troch\u0119 bardziej skomplikowane, je\u015bli masz wiele cyfr w tre\u015bci swojego posta, ale to wystarczy, aby da\u0107 wyobra\u017cenie o tym, jak pracowa\u0107 z co najmniej jedn\u0105 (jak w przyk\u0142adzie na g\u00f3rze postu).<\/p>\n<h3>3 Zaktualizuj post<\/h3>\n<p>Wreszcie, gdy <strong>post_content<\/strong> zostanie zaktualizowany, tak naprawd\u0119 wystarczy wywo\u0142a\u0107 API WordPressa, aby zaktualizowa\u0107 tre\u015b\u0107 posta.<\/p>\n<pre><code>&lt;?php\n\npublic function update_future_events( $event_id) {\n\n  $events = $this-&gt;find_all_events( $event_id );\n\n  $iteration = 1;\n  foreach ($events as $event) {\n\n    \/\/ See previous gist.\n\n    $event['post_content'] = str_ireplace( $original_year, $new_year, $event['post_content'] );\n    wp_update_post(array(\n      'ID'           =&gt; $event['ID'],\n      'post_content' =&gt; $event['post_content'],\n    ));\n  }\n}<\/code><\/pre>\n<p>Oczywi\u015bcie, jak wspomniano w ca\u0142ym po\u015bcie, tw\u00f3j kod mo\u017ce wygl\u0105da\u0107 inaczej, aspekty wydajno\u015bciowe mog\u0105 by\u0107 inne lub wymaga\u0107 innych rozwa\u017ca\u0144 (kt\u00f3re om\u00f3wi\u0119 za chwil\u0119).<\/p>\n<p>Ale je\u015bli nic wi\u0119cej, to jest przynajmniej punkt wyj\u015bcia.<\/p>\n<h2>Inne wzgl\u0119dy<\/h2>\n<p>Mog\u0105 si\u0119 zdarzy\u0107 sytuacje, w kt\u00f3rych tre\u015b\u0107 posta zawiera wiele liczb lub mog\u0105 wyst\u0105pi\u0107 tysi\u0105ce kolejnych zdarze\u0144. W ka\u017cdym z tych przypadk\u00f3w powy\u017csze podej\u015bcie mo\u017ce nie pasowa\u0107 do rachunku.<\/p>\n<p>Oznacza to, \u017ce nadal mo\u017cesz wykona\u0107 te kroki, ale mog\u0105 one nie by\u0107 najskuteczniejsze, jak napisano. W takim przypadku mo\u017ce by\u0107 konieczne skonfigurowanie procesu wsadowego do obs\u0142ugi lub wykonanie go poza godzinami pracy przy u\u017cyciu zadania cron lub jednego z kilku innych sposob\u00f3w rozwi\u0105zania problemu.<\/p>\n<p>Wy\u017cej wymienione podej\u015bcia wykraczaj\u0105 poza zakres tego postu, ale podej\u015bcie trzyetapowe pozostaje takie samo. Bardziej chodzi o dzielenie i zwyci\u0119\u017canie, aby rozwi\u0105za\u0107 problem, ni\u017c o to, jak to zrobi\u0107.<\/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>Oto punkt wyj\u015bcia do aktualizowania kolejnych wydarze\u0144, kt\u00f3re s\u0105 tworzone przez Kalendarz wydarze\u0144 za pomoc\u0105 zapyta\u0144 do bazy danych i natywnych interfejs\u00f3w API WordPress.<\/p>\n","protected":false},"author":1,"featured_media":165867,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,1020,866],"tags":[1169],"class_list":["post-229193","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-przydatne-strony","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229193","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=229193"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229193\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/165867"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}