seznam kategorií a vyloučení kategorií dítěte
<p>níže uvedený skript vytvoří seznam kategorií na webu (s výjimkou těch, které jsou v "nezařazené").</p><p>pokud je to možné, chtěl bych ho upravit tak, aby obsahoval pouze kategorie nejvyšší úrovně (žádné kategorie pro děti) ...</p><pre><code> $cat\_args = array('orderby' =&gt; 'name', 'show\_count' =&gt; $c, 'hierarchical' =&gt; $h); $cat\_args['title\_li'] = ''; $cat\_args['exclude\_tree'] = 1; wp\_list\_categories(apply\_filters('widget\_categories\_args', $cat\_args)); </code></pre>
<p>po nějaké zkoušce a omylu to je to, co je potřeba, aby to fungovalo ...</p><pre><code> $cat\_args = array('orderby' =&gt; 'count'); $cat\_args['title\_li'] = ''; $cat\_args['exclude\_tree'] = 1; $cat\_args['exclude'] = 1; $cat\_args['depth'] = 1; wp\_list\_categories(apply\_filters('widget\_categories\_args', $cat\_args)); </code></pre>
<p>to funguje pro mě. <a href="http://core.trac.wordpress.org/browser/branches/3.0/wp-admin/includes/meta-boxes.php#l535">při pohledu na kód</a> se rozevírací seznam zobrazí pouze v případě, že typ příspěvku je hierarchický (což je pravda ve vašem případě), a pokud existují další příspěvky <strong> stejného typu </strong> v databázi. příspěvek tedy nemůže být dítětem jiného typu příspěvku (například běžný příspěvek nebo stránka) a první nový příspěvek typu se nezobrazí v rozevírací nabídce.</p> <p>beru jádro otázky: "... nejsem schopen získat název třídy widgetu"</p><p>budete muset zkontrolovat proměnnou <code>global</code> <code>$wp\_registered\_widgets</code>, abyste vyplnili chybějící informace. tento testovací kód by vám měl dát nápad. kód předpokládá postranní panel s názvem <code>sidebar-1</code>. budete to muset upravit.</p><pre><code>global $wp\_registered\_widgets; $widgets = wp\_get\_sidebars\_widgets(); var\_dump($widgets['sidebar-1']); // dump the data foreach ($widgets['sidebar-1'] as $widget) { var\_dump($wp\_registered\_widgets[$widget]); // dump the data } </code></pre><p>pro více informací, <a href="https://core.trac.wordpress.org/browser/tags/3.8/src/wp-includes/widgets.php#l845">se podívejte na to, jak <code>dynamic\_sidebar</code> funguje</a> , což je v podstatě to, co jsem udělal pro to, abych výše popsal.</p><p>neotestovaný, ale tohle bylo dost zajímavé, že jsem posmíval nějaký další úplný kód:</p><pre><code>global $wp\_registered\_widgets; $i = 1; $widgets = wp\_get\_sidebars\_widgets(); $widgets = $widgets['homepage-1']; if ( have\_posts() ) { while ( have\_posts() ) { the\_post(); if ($i%3 == 0){ echo "&lt;h1&gt;widget #".($i%3)."&lt;/h1&gt;"; $cn = $wp\_registered\_widgets[$widgets[$i%3]]['callback'][0]; $cn = get\_class($cn); the\_widget($cn,$widgets[$i%3]); } get\_template\_part( 'content', get\_post\_format() ); $i++; } \_s\_paging\_nav(); } else { get\_template\_part( 'content', 'none' ); } </code></pre> <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>@ eamann má skvělou odpověď, pokud chcete různé rozvržení pro různé kategorie. otoh <strong> pokud chcete změnit css například na jinou barvu pozadí pro každou kategorii </strong>, zjistíte, že většina témat bude obsahovat kategorii slim jako css třídy na elementu <code>&lt;body&gt;</code> a/nebo případně dalších html prvcích, které jsou výstupem motivu. (a to iv případě, že vaše téma byste nemohli vždy přidat tuto funkci sami.)</p><p>například téma twentyten to dělá přesně; pro následující adresu url:</p><blockquote> <p> <a href="http://example.com/category/category-1/">http://example.com/category/category-1/</a> </p> </blockquote><p>jak vypadá prvek <code>&lt;body&gt;</code> takto:</p><blockquote> <p><code>&lt;body class="archive category category-category-1"&gt;</code></p> </blockquote><p>s vědomím výše uvedeného byste mohli přidat následující styly do souboru <code>style.css</code> vašeho motivu, který bude mít různou barvu pozadí pro každou stránku (jsem samozřejmě velmi zjednodušující, vaše skutečné css by bylo jistě sofistikovanější):</p><pre><code>/* style.css */ body.category-category-1 { background-color: red; } body.category-category-2 { background-color: green; } body.category-category-3 { background-color: blue; } </code></pre><p>vše, co opravdu potřebujete udělat, je zjistit, zda vaše téma to dělá nebo ne je <strong> zobrazit zdroj </strong> na stránkách kategorie zájmu a vyhledat vaši kategorii slug.</p><h3>použijte podřízený motiv</h3><p>pravděpodobně nechcete měnit <code>style.css</code> motivu; pravděpodobně budete chtít vytvořit <a href="https://wordpress.stackexchange.com/questions/290/customizing-a-wordpress-theme-without-changing-it/291#291"><strong> <em> child theme </em> </strong></a> místo. zde je několik odpovědí, kde mluvím o dětských tématech:</p><ul> <li> <a href="https://wordpress.stackexchange.com/questions/290/customizing-a-wordpress-theme-without-changing-it/291#291">přizpůsobení motivu wordpress bez jeho změny?</a> </li> <li> <a href="https://wordpress.stackexchange.com/questions/462/making-the-header-on-the-twenty-ten-theme-less-tall/463#463">tvorba záhlaví na téma téma dvacet deset méně tall?</a> </li> </ul><p>všimněte si, že ne všechny motivy podporují podřízené motivy. v případě těchto témat budete muset více zkoumat, jak jsou rozšířeny.</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>změna výchozího widgetu by byla dost komplikovaná.</p><p>můžete však napsat svůj vlastní krátký kód a funkci pro získání požadovaného seznamu.</p><p>hádám, že chcete mít ve svém widgetu neuspořádaný seznam?</p><p>dejte to do funkcí theme.php:</p><pre><code>add\_shortcode('archive\_by\_year\_and\_month','get\_archive\_by\_year\_and\_month'); function get\_archive\_by\_year\_and\_month($atts=array()){ global $wpdb; $years = $wpdb-&gt;get\_col("select distinct year(post\_date) from $wpdb-&gt;posts where post\_type = 'post' and post\_status = 'publish' order by post\_date desc"); if($years){ $rueckgabe = '&lt;ul&gt;'; foreach($years as $year){ $rueckgabe.='&lt;li class="jahr"&gt;&lt;a href="'.get\_year\_link($year).'"&gt;'.$year.'&lt;/a&gt;'; $rueckgabe.='&lt;ul class="monthlist"&gt;'; $months = $wpdb-&gt;get\_col($wpdb-&gt;prepare("select distinct month(post\_date) from $wpdb-&gt;posts where post\_type='post' and post\_status='publish' and year(post\_date) = %d order by post\_date asc",$year)); foreach($months as $month){ $dateobj = datetime::createfromformat('!m', $month); $monthname = $dateobj-&gt;format('f'); $rueckgabe.='&lt;li class="month"&gt;&lt;a href="'.get\_month\_link($year,$month).'"&gt;'.$monthname.'&lt;/a&gt;&lt;/li&gt;'; } $rueckgabe.='&lt;/ul&gt;'; $rueckgabe.='&lt;/li&gt;'; } $rueckgabe.='&lt;/ul&gt;'; } return $rueckgabe; } </code></pre><p>poté vložte textovou widget do postranního panelu a zadejte krátký kód:</p><pre><code>[archive\_by\_year\_and\_month] </code></pre><p>hit save and voila: měli byste dostat svůj seznam podle svého přání.</p><p>happy coding!</p> <p>místo toho může vypadat čistěji pomocí klíče a cmp:</p><pre class="lang-py prettyprint-override"><code>newlist = sorted(list\_to\_be\_sorted, key=lambda k: k['name']) </code></pre><p>nebo jak navrhl j.f.sebastian a další,</p><pre class="lang-py prettyprint-override"><code>from operator import itemgetter newlist = sorted(list\_to\_be\_sorted, key=itemgetter('name')) </code></pre><p>pro úplnost (jak je uvedeno v komentářích fitzgeraldsteele) přidejte <code>reverse=true</code> pro řazení sestupně</p><pre class="lang-py prettyprint-override"><code>newlist = sorted(l, key=itemgetter('name'), reverse=true) </code></pre> <p>mám to!!!</p><p>zde je jednoduchý 100% funkční příklad:</p><pre><code>$form['delete'] = array( '#type' =&gt; 'submit', '#value' =&gt; t('delete'), '#attributes' =&gt; array('onclick' =&gt; 'if(!confirm("really delete?")){return false;}'), ); </code></pre><p>doufám, že to pomůže.</p><p>šťastný kódování :)</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>předpokládejme, že máme soubor test.xsd, který vypadá takto:</p><pre><code>&lt;?xml version="1.0"?&gt; &lt;xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"&gt; &lt;xs:element name="myclass"&gt; &lt;xs:complextype&gt; &lt;xs:sequence&gt; &lt;xs:element name="field1" type="xs:string"/&gt; &lt;xs:element name="field2" type="xs:string"/&gt; &lt;/xs:sequence&gt; &lt;/xs:complextype&gt; &lt;/xs:element&gt; &lt;/xs:schema&gt; </code></pre><ol> <li><p>vytváření tříd pomocí nástroje xsd:</p> <pre><code>xsd.exe /classes test.xsd </code></pre> <p>to vygeneruje soubor test.cs.</p></li> <li><p>přidat soubor test.cs do řešení.</p></li> <li><p>vytvořit instanci <code>myclass</code>, definovanou ve schématu xsd a xmlserialize:</p> <pre><code>using system.xml.serialization; // ... var data = new myclass { field1 = "test1", field2 = "test2" }; var serializer = new xmlserializer(typeof(myclass)); using (var stream = new streamwriter("c:\\test.xml")) serializer.serialize(stream, data); </code></pre></li> </ol><p>výsledek:</p><pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;myclass xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"&gt; &lt;field1&gt;test1&lt;/field1&gt; &lt;field2&gt;test2&lt;/field2&gt; &lt;/myclass&gt; </code></pre>