{"id":233273,"date":"2023-02-10T16:31:00","date_gmt":"2023-02-10T13:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233273"},"modified":"2022-11-10T20:13:51","modified_gmt":"2022-11-10T17:13:51","slug":"dodaj-nastepny-losowy-post-w-szablonie-strony-wordpress-za-pomoca-sql","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/dodaj-nastepny-losowy-post-w-szablonie-strony-wordpress-za-pomoca-sql\/","title":{"rendered":"Dodaj nast\u0119pny losowy post w szablonie strony WordPress za pomoc\u0105 SQL"},"content":{"rendered":"\n<p>Cz\u0119sto mo\u017cesz uzyska\u0107 porady dotycz\u0105ce poprawy SEO (optymalizacji wyszukiwarek), dodaj\u0105c linki do poprzednich post\u00f3w podczas publikowania nowego posta. Pomaga to zwi\u0119kszy\u0107 ruch i dzia\u0142a podobnie do wtyczek takich jak \u201eWzgl\u0119dne posty&quot;, ale tylko prostsze.<\/p>\n<p>Wszystkie posty wordpress s\u0105 przechowywane w tabeli, np <strong>. wp_posts<\/strong>, a wewn\u0105trz tej tabeli znajdziesz <strong>post_title<\/strong>, <strong>post_name<\/strong> i te kolumny s\u0105 do\u015b\u0107 proste. W zale\u017cno\u015bci od konfiguracji adres\u00f3w URL post\u00f3w, mo\u017cesz mie\u0107 r\u00f3\u017cne formaty permalink\u00f3w, kt\u00f3re mo\u017cna skonfigurowa\u0107 w sekcji Ustawienia &#8211; Permanlink.<\/p>\n<p>Poni\u017cszy kod PHP mo\u017cna wstawi\u0107 do szablonu strony, zwykle <strong>single.php<\/strong>, kt\u00f3ry jest szablonem pojedynczego posta lub <strong>page.php<\/strong> dla szablonu strony.<\/p>\n<pre><code>\u00a0 global $wpdb; \/\/ include the $wpdb\n\u00a0 $query = \"select `post_title` as `title`, `post_name` as `name` from `wp_posts` where `post_type`='post' and `post_status`='publish' order by rand() limit 1\";\n\u00a0 $results = $wpdb-&gt;get_results($query); \/\/ run the query on the database\n\u00a0 if ($results) { \n\u00a0 \u00a0 $domain = $_SERVER['SERVER_NAME'];\n\u00a0 \u00a0 foreach ($results as $toppost) {\n\u00a0 \u00a0 \u00a0 \u00a0 echo \"&lt;a href=\"&lt;a class=\"vglnk\" target=\"_blank\" href=\"http:\/\/$domain\/\".$toppost-\" rel=\"nofollow\"&gt;&lt;span&gt;http&lt;\/span&gt;&lt;span&gt;:\/\/$&lt;\/span&gt;&lt;span&gt;domain&lt;\/span&gt;&lt;span&gt;\/\".$&lt;\/span&gt;&lt;span&gt;toppost&lt;\/span&gt;&lt;span&gt;-&lt;\/span&gt;&lt;\/a&gt;&gt;name.\"\/\"&gt;&lt;img title=\"Next Post: \".$toppost-&gt;title.\"\" src=\"&lt;a class=\"vglnk\" target=\"_blank\" href=\"https:\/\/helloacm.com\/static\/nextpost2.png\" rel=\"nofollow\"&gt;&lt;span&gt;https&lt;\/span&gt;&lt;span&gt;:\/\/&lt;\/span&gt;&lt;span&gt;helloacm&lt;\/span&gt;&lt;span&gt;.&lt;\/span&gt;&lt;span&gt;com&lt;\/span&gt;&lt;span&gt;\/&lt;\/span&gt;&lt;span&gt;static&lt;\/span&gt;&lt;span&gt;\/&lt;\/span&gt;&lt;span&gt;nextpost2&lt;\/span&gt;&lt;span&gt;.&lt;\/span&gt;&lt;span&gt;png&lt;\/span&gt;&lt;\/a&gt;\" alt=\"Next Post: \".$toppost-&gt;title.\"\" \/&gt;&lt;\/a&gt;\";\n\u00a0 \u00a0 }\n\u00a0 }<\/code><\/pre>\n<p>Zmie\u0144 odpowiednio <strong>wp_posts<\/strong>, poniewa\u017c mo\u017ce si\u0119 to nieco r\u00f3\u017cni\u0107. Zapytanie SQL zwraca losowy post, w kt\u00f3rym wyklucza strony lub pozycje menu, linki itp. Status postu powinien zosta\u0107 opublikowany, co wyklucza wersj\u0119 robocz\u0105. Limit <strong>1<\/strong> zwraca tylko 1 post. Wi\u0119c je\u015bli chcesz mie\u0107 poprzedni post, mo\u017cesz rozwa\u017cy\u0107 zmian\u0119 tego na <strong>limit 2<\/strong>.<\/p>\n<p>Permalink na mojej stronie jest oparty na nazwie <strong>post_name<\/strong>, kt\u00f3ra jest bardziej przyjazna dla SEO. Mo\u017cesz to dostosowa\u0107. Zapytanie SQL mo\u017cna r\u00f3wnie\u017c dostosowa\u0107. Na przyk\u0142ad mo\u017cesz chcie\u0107 zwr\u00f3ci\u0107 odpowiednie posty zamiast losowych post\u00f3w, dopasowuj\u0105c <code>title<\/code>warto\u015b\u0107 zgodnie z bie\u017c\u0105cym tytu\u0142em posta. Lub naprawd\u0119 chcesz zwr\u00f3ci\u0107 poprzedni lub nast\u0119pny post posortowany wed\u0142ug daty publikacji, mo\u017cesz u\u017cy\u0107 pola \u201epost_id&#8221;.<\/p>\n<h3>Uwagi<\/h3>\n<p>Yu \u2013 \u201eFajnie, losowo\u015b\u0107 jest naprawd\u0119 fajna. Lepiej te\u017c upewnij si\u0119, \u017ce losowy jest powi\u0105zany z aktualnym postem. Ale zazwyczaj nie jest to du\u017cy problem, o ile blog dotyczy jednego gatunku.<\/p>\n<p>R\u00f3wnie\u017c kolejno\u015b\u0107 wed\u0142ug RAND() dzia\u0142a dobrze dla tysi\u0119cy rekord\u00f3w. (zwykle w przypadku zwyk\u0142ego bloga). Ale spali twoj\u0105 baz\u0119 danych, je\u015bli masz miliony rekord\u00f3w w tej samej tabeli, kt\u00f3re spe\u0142niaj\u0105 kryteria wyszukiwania&#8221;.<\/p>\n<p>Tak, kolejno\u015b\u0107 SQL <strong>przez rand()<\/strong> jest troch\u0119 trudna i powolna. Musi pobra\u0107 wszystkie rekordy i posortowa\u0107 je losowo. Uwa\u017ca si\u0119, \u017ce wydajno\u015b\u0107 jest niska, gdy rozmiar sto\u0142u jest \u015bredni lub du\u017cy. Mo\u017cesz u\u017cy\u0107 nast\u0119puj\u0105cej sztuczki, aby szybciej uzyska\u0107 losowy rekord, u\u017cywaj\u0105c funkcji <strong>rand()<\/strong> w PHP.<\/p>\n<pre><code>\/\/ get total number of records\n$query = \"select count(1) from `table`\";\n$result = mysql_query($query) or die(mysql_error());\n$total = mysql_result($result, 0, 0);\n\n\/\/ get a random\n$r = rand(0, $total - 1);\n\/\/ return a number between 0 and $total - 1 inclusive using PHP\n$query = \"select * from `table` limit $r, 1\";\n$result = mysql_query($query) or die(mysql_error());<\/code><\/pre>\n<p><strong>Limit<\/strong> powoduje, \u017ce SQL okre\u015bla przesuni\u0119cie, a drugi parametr okre\u015bla liczb\u0119 rekord\u00f3w do pobrania.<\/p>\n<h3>Lepszy zapis losowy<\/h3>\n<p>Zgodnie z powy\u017cszym, <strong>kolejno\u015b\u0107 wed\u0142ug rand()<\/strong> jest wyj\u0105tkowo nieefektywna, je\u015bli masz bardzo du\u017c\u0105 tabel\u0119, poniewa\u017c do sortowania (nawet je\u015bli chcesz tylko jednego elementu) funkcja <strong>rand()<\/strong> zostanie wywo\u0142ana, a tego nie robimy chcie\u0107. Mo\u017cemy to poprawi\u0107, u\u017cywaj\u0105c dw\u00f3ch zapyta\u0144, pierwsze zwraca ca\u0142kowit\u0105 liczb\u0119 post\u00f3w, a my mamy funkcj\u0119 random PHP i uzyskujemy losowy rekord za pomoc\u0105 instrukcji <strong>limit .<\/strong><\/p>\n<pre><code>global $wpdb; \/\/ include the $wpdb\n$query= \"select count(1) from `wp_posts` where `post_type`='post' and `post_status`='publish'\";\n$cnt = $wpdb-&gt;get_var($query); \/\/ run the query on the database and return single variable\n$rand = mt_rand(0, $cnt - 1);\n$query= \"select `post_title` as `title`, `post_name` as `name` from `wp_posts` where `post_type`='post' and `post_status`='publish' limit $rand,1\";\n$results = $wpdb-&gt;get_results($query); \/\/ run the query on the database\n\/\/ the rest are the same<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/helloacm.com\" class=\"external external_icon\">helloacm.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dodaj kolejny losowy post w szablonie strony WordPress<\/p>\n","protected":false},"author":1,"featured_media":224094,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[897,721,721,897,1110,805,805,836,836,845,845,866,866],"tags":[1169],"class_list":["post-233273","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kod","category-deweloper","category-n-a","category-php-7","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\/233273","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=233273"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233273\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/224094"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}