poškozená databáze wordpress
<p>nejpodivnější wordpress problém někdy myslím. stránky klientů s rozsáhlou databází příspěvků mají svou vlastní mysl. jednu minutu se vše zdá být v pořádku, další příspěvky, kategorie a značky chybí.</p><p>v okamžiku, kdy mě přístrojová deska vypráví, že je 2309 příspěvků v 9 kategoriích, ale když kliknu na odkaz kategorie v aplikaci admin, v seznamu není žádný.</p><p>vidím všechny příspěvky v admin, ale vzhledem k tomu, že byly přiřazeny do kategorií a mají uvedené značky, všechny jsou nyní "nezařazené" s "žádné tagy".</p><p>je zřejmé, že wordpress databáze je poškozen nějakým způsobem, ale kde začít zkusit opravit !?</p><p>to, co jsem zatím testoval:</p><p>pluginy - vypnul jsem všechny aktuální pluginy. téma - zkoušel jsem jiné téma/šablonu. wordpress core - re-uploaded nejnovější verzi wordpress. aktualizace - aktualizoval jsem všechny pluginy a jádro wordpressu. oprava databáze - zkontroloval jsem a pokusil se opravit databázi v cpanelu, ale vypršel.</p><p>pomoc!?</p>
<p>pravděpodobně se dostáváte do radostí mysql myisam engine ...</p><p>v rámci mysql (nebo phpmyadmin) použijte příkazy repair table xyz znovu, opakovaně, na každé z vašich tabulek (nebo spíše tabulek souvisejících s vašimi podmínkami, protože to jsou ty, které znějí zkaženě), aby se zjistilo, zda to nic nevyřeší.</p><p>pokud selžou, existuje několik zdokumentovaných řešení:</p><p> <a href="http://www.google.com/search?q=recover+a+corrupt+mysql+database">http://www.google.com/search?q=recover+a+corrupt+mysql+database</a> </p><p>jakmile jsou věci obnoveny, spusťte příkazy optimalizovat tabulku xyz na každé tabulce a poté změňte motor databáze a každou tabulku, aby byla použita innodb. innodb poněkud neuspořádá katalog (zejména pokud upustíte databázi nebo velké tabulky), ale - pokud je kompatibilní s acid - je to o dost méně náchylné k chybám než myisam.</p>
<p>čištění wordpress instalace nebo jakéhokoli webu těchto souborů je obecně jednoduché. pokud existuje vzor, ​​proveďte vyhledávání příslušných souborů a pak nahraďte špatný kód.</p><p>v případě wordpress existuje několik různých zdrojů špatného kódu (pravděpodobně dalších):</p><ol> <li>byl nainstalován již infikovaný motiv</li> <li>heslo ftp vašeho webu bylo uhádnuto a napadeno hackery</li> <li>wordpress je nezabezpečený a umožňuje instalaci červa</li> </ol><p>jedna věc, kterou můžete udělat, je nainstalovat <a href="http://wordpress.org/extend/plugins/tac/">tac (theme authenticity checker)</a> , který vyhledá špatné věci.</p><p>viz <a href="http://codex.wordpress.org/hardening\_wordpress"><strong> vytvrzování wordpress </strong></a> , kde jsou kroky, které mají zajistit, aby wordpress bylo bezpečnější. ale v zásadě, když jsem viděl, že se to stane, co se děje, je všechno zpět (databáze a všechny soubory), pak odfoukněte instalaci a nainstalujte novou instalaci wordpress, nové náhradní pluginy a nové téma ( pokud bylo vaše téma vlastní, zbavte se špatného kódu nejprve!).</p><p>googling pro „wordpress infection“ by vám měl dostat další články s podobnou radou.</p> <p><em><strong>update</strong></em>: když jsem poprvé zaslal svou odpověď, zmeškal jsem podstatu otázky; moje odpověď byla o zabezpečení <code>.htaccess</code> obecně a nyní je uvedena pod dvojitou linií (podívejte se dolů, pokud vás to zajímá.) bohužel nemám specifické zkušenosti s zabezpečením <code>/wp-admin/</code> pomocí <code>.htaccess</code>, takže jednoduše uvedu dva zdroje, které budu sledovat kdy a jestli to potřebuji:</p><ul> <li> <a href="http://blogsecurity.net/wordpress/article-210607">vytvrzování wordpressu pomocí .htaccess</a> </li> <li> <a href="http://www.askapache.com/wordpress/htaccess-password-protect.html#comment">askapache ochrana heslem, pro wordpress</a> </li> </ul><p>první z nich doporučuje následující (a zde je <a href="http://wordpress.org/support/topic/codes-for-htaccess-in-wp-admin">nějaká diskuse o tom</a> .)</p><pre><code>&lt;files ~ "\.(php)$"&gt; authuserfile /etc/httpd/htpasswd authtype basic authname "restricted" order deny,allow deny from all require valid-user satisfy any &lt;/files&gt; </code></pre><p>ten má spoustu informací, zejména v komentářích, ale pokud vám poskytneme seznam ke čtení, není to odpověď, kterou jste hledali.</p><p>je mi líto, že jsem nemohl být na tomto místě užitečnější.</p><p></p><p>obvykle wordpress má pouze následující, které zpracovávaly zpracování permalinků a nesouvisí s bezpečností:</p><pre><code># begin wordpress &lt;ifmodule mod\_rewrite.c&gt; rewriteengine on rewritebase / rewriterule ^index\.php$ - [l] rewritecond %{request\_filename} !-f rewritecond %{request\_filename} !-d rewriterule . /index.php [l] &lt;/ifmodule&gt; # end wordpress </code></pre><p>nedávno jsem našel <a href="http://wordpress.org/extend/plugins/wp-htaccess-control/">wp htacess control</a> plugin, který spravuje spoustu <code>.htaccess</code> pro vás a já to mám moc rád. po úpravě nastavení přidala následující možnosti:</p><pre><code># wphtc: disable serversignature on generated error pages serversignature off # wphtc: disable directory browsing options all -indexes # wphtc: protect wp-config.php &lt;files wp-config.php&gt; order allow,deny deny from all &lt;/files&gt; # wphtc: protect .htaccess file &lt;files ~ "^.*\.([hh][tt][aa])"&gt; order allow,deny deny from all &lt;/files&gt; </code></pre><p>přidala také tyto možnosti, které se týkají výkonu místo zabezpečení:</p><pre><code># wphtc: setting mod\_gzip &lt;ifmodule mod\_gzip.c&gt; mod\_gzip\_on yes mod\_gzip\_dechunk yes mod\_gzip\_item\_include file \.(html?|txt|css|js|php|pl)$ mod\_gzip\_item\_include handler ^cgi-script$ mod\_gzip\_item\_include mime ^text/.* mod\_gzip\_item\_include mime ^application/x-javascript.* mod\_gzip\_item\_exclude mime ^image/.* mod\_gzip\_item\_exclude rspheader ^content-encoding:.*gzip.* &lt;/ifmodule&gt; # wphtc: setting mod\_deflate &lt;ifmodule mod\_deflate.c&gt; addoutputfilterbytype deflate text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript browsermatch ^mozilla/4 gzip-only-text/html browsermatch ^mozilla/4.0[678] no-gzip browsermatch bmsie !no-gzip !gzip-only-text/html header append vary user-agent env=!dont-vary &lt;/ifmodule&gt; </code></pre><p>kromě toho jsou některé pluginy, které jsem se nesnažil, ale které jsou zaměřeny na zabezpečení a které pracují s <code>.htaccess</code> - můžete je zkusit každý, abyste viděli, co dělají v souboru <code>.htaccess</code>:</p><ul> <li> <a href="http://wordpress.org/extend/plugins/wp-super-secure-and-fast-htaccess/">wp super bezpečný a rychlý htaccess</a> ( <a href="http://www.andreapernici.com/wordpress/wp-super-secure-and-fast-htaccess/">také</a> )</li> <li> <a href="http://wordpress.org/extend/plugins/bulletproof-security/">bulletproof zabezpečení</a> </li> <li> <a href="http://wordpress.org/extend/plugins/silence-is-golden-guard/">ticho je zlatá stráž</a> </li> <li> <a href="http://wordpress.org/extend/plugins/wp-blockyou/">wp-blockyou</a> </li> <li> <a href="http://wordpress.org/extend/plugins/stealth-login/screenshots/">stealth přihlášení</a> </li> <li> <a href="http://wordpress.org/extend/plugins/http-authentication/">ověření http</a> </li> <li> <a href="http://wordpress.org/extend/plugins/askapache-password-protect/">askapache password protect</a> </li> </ul><p>kromě toho, pokud chcete znát (imo) # 1 expert zdroj na <a href="http://www.askapache.com/search/wordpress+security/">zabezpečení apache související s wordpress</a> můžete najít na <a href="http://www.askapache.com/">askapache.com</a> ; vole je hardcore! jeho blog nevyřeší váš problém "<em>příliš mnoho informací</em>", ale alespoň ho můžete zobrazit jako autoritativní zdroj!</p><p>zde jsou některé příklady (i když ne všechny jsou přímo související s wordpressem)</p><ul> <li> <a href="http://www.askapache.com/wordpress/advanced-wp-config-php-tweaks.html">pokročilé aplikace wordpress wp-config.php tweak</a> </li> <li> <a href="http://www.askapache.com/security/wordpress-plugin-for-apache-htaccess-security.html#menu0-el1">příklad .htaccess pro wordpress</a> </li> <li> <a href="http://www.askapache.com/wordpress/wordpress-404.html">pokročilá aplikace wordpress 404</a> </li> <li> <a href="http://www.askapache.com/htaccess/mod\_security-htaccess-tricks.html">mod\_security .htaccess triky</a> </li> <li> <a href="http://www.askapache.com/htaccess/htaccess-plugin-blocks-spam-hackers-and-password-protects-blog.html">plugin bloků .htaccess blok spamu, hackerů a hesel</a> </li> </ul><p>každopádně doufám, že to pomůže.</p> <p>největší wordpress giveaways jsou mezi <code>&lt;head&gt; &lt;/head&gt;</code> tagy.</p><p><strong> příklad výstupu obsahu wordpressu podle tématu twentyten a jak odstranit: </strong></p><pre><code>&lt;link rel="profile" href="http://gmpg.org/xfn/11" /&gt; </code></pre><p>odebrat přímo z header.php</p><pre><code> &lt;link rel="stylesheet" type="text/css" media="all" href="http://example.com/wp-content/themes/twentyten/style.css" /&gt; </code></pre><p>skrýt wordpress voláním šablony stylů z jiného umístění a změňte adresář wp-content. wordpress vyžaduje, aby vaše téma obsahovalo některé základní informace v horní části stylu style.css (style.css musí být v kořenovém adresáři motivů). budete muset vytvořit alternativní css a zavolat z hlavy. wordpress nevyžaduje, abyste používali motivy style.css, pouze to vyžaduje, aby byl v adresáři motivů.</p><p>odebrat přímo z header.php</p><pre><code>&lt;link rel="alternate" type="application/rss+xml" title="example blog &amp;raquo; feed" href="http://example.com/feed/" /&gt; &lt;link rel="alternate" type="application/rss+xml" title="example blog &amp;raquo; comments feed" href="http://example.com/comments/feed/" /&gt; &lt;link rel="edituri" type="application/rsd+xml" title="rsd" href="http://example.com/xmlrpc.php?rsd" /&gt; &lt;link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://example.com/wp-includes/wlwmanifest.xml" /&gt; &lt;link rel='index' title='example blog' href='http://example.com/' /&gt; &lt;meta name="generator" content="wordpress 3.1-alpha" /&gt; </code></pre><p>chcete-li tyto dodatečné odkazy odebrat, můžete přidat filtr do funkcí .php</p><pre><code>// remove junk from head remove\_action('wp\_head', 'rsd\_link'); remove\_action('wp\_head', 'wp\_generator'); remove\_action('wp\_head', 'feed\_links', 2); remove\_action('wp\_head', 'index\_rel\_link'); remove\_action('wp\_head', 'wlwmanifest\_link'); remove\_action('wp\_head', 'feed\_links\_extra', 3); remove\_action('wp\_head', 'start\_post\_rel\_link', 10, 0); remove\_action('wp\_head', 'parent\_post\_rel\_link', 10, 0); remove\_action('wp\_head', 'adjacent\_posts\_rel\_link', 10, 0); </code></pre><p>můžete změnit svůj adresář pluginů a adresář wp-content ve vašem souboru wp-config.php, ale můžete mít nějaké problémy, pokud váš motiv nebo pluginy nepoužívají správnou metodu pro volání souborů.</p><pre><code>define( 'wp\_content\_dir', $\_server['document\_root'] . '/new-wp-content' ); </code></pre><p>nastavte wp\_content\_url na úplný identifikátor uri tohoto adresáře (bez koncového lomítka), např.</p><pre><code>define( 'wp\_content\_url', 'http://example/new-wp-content'); </code></pre><p>volitelné nastavte wp\_plugin\_dir na úplnou místní cestu tohoto adresáře (bez koncového lomítka), např.</p><pre><code>define( 'wp\_plugin\_dir', $\_server['document\_root'] . '/new-wp-content/new-plugins' ); </code></pre><p>nastavte wp\_plugin\_url na úplný identifikátor uri tohoto adresáře (bez koncového lomítka), např.</p><pre><code>define( 'wp\_plugin\_url', 'http://example/new-wp-content/new-plugins'); </code></pre><p><strong>pluginy</strong></p><p>uvědomte si, že některé pluginy jako akismat, all in one seo, w3-total-cache, super cache a mnoho dalších přidávají komentáře k výstupu html. většina z nich lze snadno upravit, aby se odstranily komentáře, ale vaše změny budou přepsány kdykoliv aktualizací pluginů.</p><p><strong> wp-includes </strong></p><p>adresář wp-includes uchovává jquery a různé další soubory js, které témata nebo pluginy budou volat pomocí wp\_enqueue\_script (). chcete-li to změnit, musíte zrušit registraci výchozích skriptů aplikace wordpress a zaregistrovat nové umístění. přidat do funkcí.php:</p><pre><code>function my\_init() { if (!is\_admin()) { // comment out the next two lines to load the local copy of jquery wp\_deregister\_script('jquery'); wp\_register\_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js', false, '1.3.2'); wp\_enqueue\_script('jquery'); } } add\_action('init', 'my\_init'); </code></pre><p>to bude nutné provést s každým skriptem používaným vaším motivem nebo zásuvnými moduly.</p> <p>v nabídce <code>tools &gt; import</code> na vašem webu je plugin, který můžete nainstalovat s názvem <strong> <a href="http://wordpress.org/extend/plugins/wpcat2tag-importer/">převaděč kategorií a značek</a> </strong>, který po instalaci vám poskytne kontrolu nad tím, jak zacházet s kategoriemi, které byste chtěli převést.</p><p>jedná se o relativně bezbolestný proces ve třech případech, kdy jsem ho použil, ale nikdy jsem se nezabýval migrací starších adres url. pokud se jedná o problém a kategorie „slimáci“ pro kategorii jsou stejné a běžíte pod aplikací apache, mělo by to být trikem některých směrnic <code>.htaccess</code>. takže za předpokladu, že máte adresy url, jako například:</p><pre><code>http://example.com/archive/category/foo http://example.com/archive/category/bar </code></pre><p>a chci je změnit na:</p><pre><code>http://example.com/archive/tag/foo http://example.com/archive/tag/bar </code></pre><p>do svého souboru <code>.htaccess</code> byste přidali směrnice pro každou z nich, například:</p><pre><code>redirect permanent /archive/category/bar http://example.com/archive/tag/bar redirect permanent /archive/category/foo http://example.com/archive/tag/foo </code></pre><p>nyní to předpokládá, že je chcete přesměrovat, a žádný z autorů vašeho blogu tyto kategorie nepřidá!</p><p>ale obecně by to byl přístup, který by fungoval.</p><p>pokud jste <strong> vůbec </strong> znepokojeni ztrátou dat, když změníte obsah, zálohujte databáze mysql. <em> promiň, musel jsem to křičet. : -) </em> a pokud jde o haywire, pak jednoduše obnovte databázi.</p><p>pokud jste ve svém obsahu odkazovali na tyto staré adresy url, přesměrují se dobře. ale můžete také spustit <a href="http://wordpress.org/extend/plugins/search-and-replace/"><strong> wordpress search and replace </strong></a> plugin, který usnadňuje migraci, jako je tato, ale opět, zálohy mysli, zejména s plugin pro vyhledávání a nahrazování, protože provádí změny bez zálohy.</p> <p>obsah můžete přidat do <a href="http://core.trac.wordpress.org/browser/branches/3.0/wp-admin/edit-tag-form.php">stránek pro úpravu kategorií</a> pomocí zaháknutí do <code>edit\_category\_form\_fields</code> (stále v tabulce formuláře) nebo <code>edit\_category\_form</code> (mimo tabulku, ale před tlačítkem odeslat ). podobné háčky existují pro značky nebo vlastní taxonomie, zkontrolujte zdroj. chcete-li zvládnout tyto dodatečné hodnoty, musíte najít dobrý háček sami, ujistěte se, že s ním budete pracovat <a href="http://core.trac.wordpress.org/browser/branches/3.0/wp-admin/edit-tags.php#l135">před přesměrováním <code>editedtag</code></a> .</p><p>neexistují žádné čisté meta box manipulátory, musíte napsat většinu kódu sami. ale dejte nám prosím vědět, jak jste to udělali, mohlo by to být zajímavé pro ostatní!</p> <p>stručná odpověď:</p><ul> <li>pluginy nemodifikují existující soubory, zavádějí se do wordpressu přes exponované api.</li> <li>pluginy mohou modifikovat databázové schéma.</li> <li>pluginy nemusí odinstalovat čistě.</li> </ul><h1>zásuvkové háčky</h1><p>pluginy zavěsí do wordpressu v určitém místě vystaveném jádrem wordpressu.</p><p> <a href="http://codex.wordpress.org/plugin\_api">http://codex.wordpress.org/plugin\_api</a> </p><p>jako příklad, funkce <code>get\_option()</code> čte možnost webu z databáze. než bude v této funkci provedena jakákoli skutečná akce, wordpress volá <code>apply\_filters( 'pre\_option\_' . $option, false )</code>. vzhledem k možnosti <code>foobar</code> by plugin mohl přepsat skutečnou hodnotu této volby následujícím kódem:</p><pre><code>function override\_foobar( $unused ) { return 'my custom value.'; } add\_filter( 'pre\_option\_foobar', 'override\_foobar' ); // add\_filter(hook, function) </code></pre><p>viz také <a href="http://adambrown.info/p/wp\_hooks/">http://adambrown.info/p/wp\_hooks/</a> .</p><h1>pluginy modifikující databázi</h1><p>pluginy mají schopnost upravovat databázi, za předpokladu, že uživatel databáze wordpress má stále toto oprávnění. některé složitější pluginy přidávají vlastní tabulky. je možné, že by plugin mohl modifikovat základní tabulky, a doufejme, že by to dělali zodpovědně a způsobem, který by v případě, že by byl plugin odstraněn.</p><p>to musí být zkoumáno na základě plugin-by-plugin.</p><h1>odinstalace zásuvných modulů</h1><p>funkce <code>deactivate\_plugins()</code> volá akci <code>do\_action( 'deactivate\_' . trim( $plugin ) )</code>. zásuvný modul by se měl připojit k této akci, pokud se při deaktivaci pluginu musí provést určité věci. podle mých zkušeností několik pluginů dělá spoustu deaktivace vyčištění, tj. jejich nastavení v chladicím prostoru, pokud jsou znovu aktivovány.</p> <p>to, co chcete, je možné, ale bude vyžadovat, abyste se ponořili do<strong> sql, kterému se chci vyhnout, kdykoli je to možné </strong>(ne proto, že to nevím, jsem vývojář sql, ale protože<strong> in wordpress chcete použít api kdykoli je to možné </strong>minimalizovat budoucí problémy s kompatibilitou související s budoucími potenciálními změnami struktury databáze.)</p><h2>sql s operátorem <code>union</code> je možnost</h2><p>chcete-li použít sql, co potřebujete, je operátor <code>union</code> ve vašem dotazu, něco takového za předpokladu, že vaše kategorie slugs jsou <code>"category-1"</code>, <code>"category-1"</code> a <code>"category-3"</code>:</p><pre><code>select * from wp\_posts where id in ( select tr.object\_id from wp\_terms t inner join wp\_term\_taxonomy tt on t.term\_id = tt.term\_id inner join wp\_term\_relationships tr on tt.term\_taxonomy\_id = tr.term\_taxonomy\_id where tt.taxonomy='category' and t.slug='category-1' limit 5 union select tr.object\_id from wp\_terms t inner join wp\_term\_taxonomy tt on t.term\_id = tt.term\_id inner join wp\_term\_relationships tr on tt.term\_taxonomy\_id = tr.term\_taxonomy\_id where tt.taxonomy='category' and t.slug='category-2' limit 5 union select tr.object\_id from wp\_terms t inner join wp\_term\_taxonomy tt on t.term\_id = tt.term\_id inner join wp\_term\_relationships tr on tt.term\_taxonomy\_id = tr.term\_taxonomy\_id where tt.taxonomy='category' and t.slug='category-3' limit 5 ) </code></pre><h2>sql union můžete použít s <code>posts\_join</code> filtrem</h2><p>pomocí výše uvedeného můžete buď<strong> jen zavolat přímo </strong>nebo můžete<strong> použít <code>posts\_join</code> háček filtru </strong>jako následovně; poznámka používám <a href="http://www.phpf1.com/tutorial/php-heredoc-syntax.html"><strong> php heredoc </strong></a> , takže se ujistěte, že <code>sql;</code> je flush vlevo. také jsem si všiml, že jsem použil globální var, abych vám umožnil definovat kategorie mimo háček výčtem kategorie slimáků v poli. tento kód můžete umístit do pluginu nebo do souboru <code>functions.php</code> motivu:</p><pre><code>&lt;?php global $top\_5\_for\_each\_category\_join; $top\_5\_for\_each\_category\_join = array('category-1','category-2','category-3'); add\_filter('posts\_join','top\_5\_for\_each\_category\_join',10,2); function top\_5\_for\_each\_category\_join($join,$query) { global $top\_5\_for\_each\_category\_join; $unioned\_selects = array(); foreach($top\_5\_for\_each\_category\_join as $category) { $unioned\_selects[] =&lt;&lt;&lt;sql select object\_id from wp\_terms t inner join wp\_term\_taxonomy tt on t.term\_id = tt.term\_id inner join wp\_term\_relationships tr on tt.term\_taxonomy\_id = tr.term\_taxonomy\_id where tt.taxonomy='category' and t.slug='{$category}' limit 5 sql; } $unioned\_selects = implode("\n\nunion\n\n",$unioned\_selects); return $join . " inner join ($unioned\_selects) categories on wp\_posts.id=categories.object\_id " ; } </code></pre><h2>ale mohou být vedlejší účinky</h2><p>samozřejmě s použitím háčků pro modifikaci dotazů, jako je <code>posts\_join</code>, vždy zvou vedlejší efekty v tom, že působí globálně na dotazy, a proto je obvykle nutné zabalit vaše změny do <code>if</code>, které je používají pouze v případě potřeby a jaká kritéria pro testování mohou být složitá.</p><h2>zaměřte se spíše na optimalizaci?</h2><p>domnívám se však, že vaše otázka se týká<strong> více o optimalizaci </strong>než o tom, že dokážete udělat 5 nejlepších dotazů v čase 3, ne? pokud tomu tak je, pak možná existují další možnosti, které používají wordpress api?</p><h2>lepší je použití přechodových api pro ukládání do mezipaměti?</h2><p>předpokládám, že vaše příspěvky se nezmění tak často, správně? co když přijmete periodicky tří (3) dotaz a poté výsledky uložíte pomocí <a href="http://codex.wordpress.org/transients\_api"><strong> transients api </strong></a> ? získáte udržovatelný kód a skvělý výkon; dobrý bit lepší než <code>union</code> dotaz výše, protože wordpress uloží seznamy příspěvků jako serializované pole v jednom záznamu tabulky <code>wp\_options</code>.</p><p>chcete-li si to vyzkoušet, můžete provést následující příklad a vložit jej do kořenového adresáře webu jako <code>test.php</code>:</p><pre><code>&lt;?php $timeout = 4; // 4 hours $categories = array('category-1','category-2','category-3'); include "wp-load.php"; $category\_posts = get\_transient('top5\_posts\_per\_category'); if (!is\_array($category\_posts) || count($category\_posts)==0) { echo "hello every {$timeout} hours!"; $category\_posts = array(); foreach($categories as $category) { $posts = get\_posts("post\_type=post&amp;numberposts=5&amp;taxonomy=category&amp;term={$category}"); foreach($posts as $post) { $category\_posts[$post-&gt;id] = $post; } } set\_transient('top5\_posts\_per\_category',$category\_posts,60*60*$timeout); } header('content-type:text/plain'); print\_r($category\_posts); </code></pre><h2>souhrn</h2><p>zatímco ano, můžete udělat to, co jste požadovali pro použití dotazu sql <code>union</code> a háčku <code>posts\_join</code>, což je pravděpodobně lepší nabídka pomocí mezipaměti s<strong> <em>transients api</em> </strong>.</p><p>snad to pomůže?</p> <p>-1 je vaše odpověď! vyhledejte <code>posts\_per\_page</code> <a href="http://codex.wordpress.org/class\_reference/wp\_query#pagination\_parameters">zde</a> .</p><pre><code>$args = array( 'post\_type' =&gt; 'post', 'cat' =&gt; '22,47,67', 'orderby' =&gt; 'name', 'order' =&gt; 'asc', 'hide\_empty' =&gt; 1, 'depth' =&gt; 1, 'posts\_per\_page' =&gt; -1 ); </code></pre><p><strong> důležité upozornění </strong>: to může mít za následek velmi obrovský dotaz, který může web snížit. udělejte to pouze v případě, že jste si jisti, že s databází může pracovat. ne ve veřejných tématech nebo pluginech.</p> Pokud jsi měla zapnuté automatické zálohování fotek na Google Disk, OneDrive, icloud, atd... tak fotky najdeš možná tam. Pokud ne, budeš muset najít program, který ti ji opraví bez vodoznaku. V čem přesně spočívá poškození fotek? Všechno jde opravit. Napiš na podporu M$ a popiš jim, jakou chybu jsi v jejich SW objevil, a oni ji opraví a možná ti i poděkují.