jak mohu upravit data příspěvku před uložením?
<p>mám plugin a chtěl bych být schopen spustit obsah příspěvku prostřednictvím některých filtrů před tím, než bude uložen do databáze. z pohledu <a href="http://codex.wordpress.org/plugin\_api">plugin api</a> , vidím, že dva háčky, které vypadají, že by mohly být užitečné:</p><pre><code>save\_post wp\_insert\_post </code></pre><p>jediný problém je, že to vypadá, že <code>save\_post</code> nepotřebuje vrátit proměnnou, a tak nevím, jak filtrovat obsah, a <code>wp\_insert\_post</code> vypadá zdokumentováno.</p><p>chci něco takového udělat:</p><pre><code>add\_action('whatever\_hook\_name','my\_function'); function my\_function($post\_content){ return $post\_content.' &lt;br&gt; this post was saved on '.time(); } </code></pre><p>udělám něco užitečnějšího, než připojit časové razítko, konkrétně spustit některé regex filtry, ale toto je obecný typ filtru/akce, kterou se snažím přidat.</p><p><strong> aktualizovat </strong></p><p>vezměte prosím na vědomí, že chci zachytit data o tom, jak se ukládají do databáze - ne když se zobrazují v příspěvku (např .: ne přidáním filtru do <code>the\_content</code>)</p>
<p>filtr <a href="http://codex.wordpress.org/plugin\_api/filter\_reference/wp\_insert\_post\_data">wp\_insert\_post\_data</a> filter to může udělat:</p><pre><code>add\_filter( 'wp\_insert\_post\_data' , 'filter\_post\_data' , '99', 2 ); function filter\_post\_data( $data , $postarr ) { // change post title $data['post\_title'] .= '\_suffix'; return $data; } </code></pre>
<p>rozhraní api <a href="http://codex.wordpress.org/widgets\_api#developing\_widgets\_on\_2.8.2b">widgetů</a> je nejrychlejší způsob, jak vytvořit widget, který lze znovu použít. příklad použití:</p><pre><code>class my\_widget extends wp\_widget { /** * php4 constructor */ function my\_widget() { my\_widget::\_\_construct(); } /** * php5 constructor */ function \_\_construct() { // actual widget processes } /** * echo the settings update form * * @param array $instance current settings */ function form($instance) { // outputs the options form on admin } /** * update a particular instance * * @param array $new\_instance new settings for this instance as input by the user via form() * @param array $old\_instance old settings for this instance * @return array settings to save or bool (false) to cancel saving */ function update($new\_instance, $old\_instance) { // processes widget options to be saved } /** * echo the widget content * * @param array $args display arguments including before\_title, after\_title, before\_widget, and after\_widget * @param array $instance the settings for the particular instance of this widget */ function widget($args, $instance) { // outputs the content of the widget } } register\_widget('my\_widget'); </code></pre> <p>zde je kód, který používám vždy, když nastavím nový blog wordpress:</p><p>custom admin footer text</p><pre><code>// customize admin footer text function custom\_admin\_footer() { echo '&lt;a href="http://www.netconstructor.com/"&gt;website design by netconstructor, inc.&lt;/a&gt;'; } add\_filter('admin\_footer\_text', 'custom\_admin\_footer'); </code></pre><p>vymazat verze informací z head krmiv</p><pre><code>// remove version info from the head of feeds function complete\_version\_removal() { return ''; } add\_filter('the\_generator', 'complete\_version\_removal'); </code></pre><p>odstraňte junk z hlavy stránk veřejných stránků</p><pre><code>// remove junk from the header of public website pages 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>odstranit oznámení o wordpressu pro všechny uživatele except sysadmin</p><pre><code>// remove the wordpress update notification for all users except sysadmin global $user\_login; get\_currentuserinfo(); if ($user\_login !== "sysadmin") { add\_action( 'init', create\_function( '$a', "remove\_action( 'init', 'wp\_version\_check' );" ), 2 ); add\_filter( 'pre\_option\_update\_core', create\_function( '$a', "return null;" ) ); } </code></pre><p>uživatelský admin logos:</p><pre><code>// custom admin login header logo function my\_custom\_login\_logo() { echo '&lt;style type="text/css"&gt; h1 a { background-image:url('.get\_bloginfo('template\_directory').'/images/excitesteps-login-logo.png) !important; } &lt;/style&gt;'; } add\_action('login\_head', 'my\_custom\_login\_logo'); // custom admin logic header logo add\_action('admin\_head', 'my\_custom\_logo'); function my\_custom\_logo() { echo '&lt;style type="text/css"&gt;#header-logo { background-image: url('.get\_bloginfo('template\_directory').'/images/excitesteps-icon.gif) !important; }&lt;/style&gt;'; } // custom admin login header link &amp; alt text function change\_wp\_login\_url() { echo bloginfo('url'); } function change\_wp\_login\_title() { echo get\_option('blogname'); } add\_filter('login\_headerurl', 'change\_wp\_login\_url'); add\_filter('login\_headertitle', 'change\_wp\_login\_title'); </code></pre> <p>ve skutečnosti je velmi snadné připojit obrázky k příspěvkům a stránkám přímo v editoru. stačí kliknout na tlačítko přidat obrázek (hned napravo od položky nahrát/vložit) a získat přístup k uživateli, který video nahrál.</p><p>můžete nahrát tolik obrázků, kolik chcete, do galerie médií pro tuto stránku a upravovat meta informace přiřazené každému. poté klikněte na tlačítko "save changes" (uložit změny) a obrázky uložte.</p><p>pokud jde o wordpress, tyto obrázky budou "připojeny" k příspěvku nebo stránce, na které jste je přidali ... není třeba jít do media gallery udělat upload. zobrazí se pouze na příspěvku nebo na stránce, pokud po nahrání kliknete na možnost vložit do pošty.</p><h3>aktualizace</h3><p>pro ty z vás, kteří to dříve nepoužívali ... můžete přistupovat k tomuto uživateli prostřednictvím těchto ikon:</p><p><img src="https://i.stack.imgur.com/p4bqt.png" alt="upload/insert button toolbar"></p><p>samotný uploader se objeví na stejné stránce - tuto funkci nemusíte používat nikam jinam.</p><p><img src="https://i.stack.imgur.com/1f7wd.png" alt="screenshot of the media gallery"></p><p>můžete nahrát více obrázků najednou. buď klikněte na tlačítko "vybrat soubory" a vyberte je jeden po druhém, nebo vyberte svazek (klikněte a táhněte) a všechny se nahrají současně.</p><p><img src="https://i.stack.imgur.com/f0num.png" alt="upload multiple images at once"></p><p>jakmile jsou obrázky nahrány, můžete je spravovat v interní galerii příspěvku nebo stránky. obrázky můžete znovu označit, měnit podrobnosti přiřazené každému z nich a přetahovat je po sobě.</p><p><img src="https://i.stack.imgur.com/e93gp.png" alt="post media gallery"></p> <p>pokud máte ftp přístup k vašemu serveru, nejbezpečnější nastavení není mít vaše motivy nebo pluginy adresáře zapisovatelné váš webserver a místo toho mít wordpress aktualizovat soubory pomocí ftp. když jdete na aktualizaci pluginu, wordpress vás vyzve k zadání podrobností o ftp.</p><p>metoda ftp je mnohem pomalejší než přímé zápisy souborů, ale je mnohem bezpečnější, protože nečestný skript nebude moci soubory upravovat.</p> <p>doporučuji pro to použít vlastní taxonomii <em> ne </em> vlastní pole. archivy můžete třídit a zobrazovat na základě taxonomie mnohem snadněji než u vlastních polí.</p><p>pokud však chcete seznam na základě vlastního pole, budete muset upravit argumenty odeslané na stránku <code>query\_posts()</code> na stránce archivu a předat je v souboru <code>meta\_key</code> a <code>meta\_value</code>, které hledáte.</p><p>přidání proměnné dotazu:</p><pre><code>add\_action('init', 'add\_custom\_meta\_url'); function add\_custom\_meta\_url() { global $wp,$wp\_rewrite; $wp-&gt;add\_query\_var('location'); $wp\_rewrite-&gt;add\_rule('location/([^/]+)','index.php?location=$matches[1]','top'); $wp\_rewrite-&gt;flush\_rules(false); // this should really be done in a plugin activation } </code></pre><p>pak se vaše permalinks pro archiv stane něčím v souladu s <code>http://mycoollocationsite.com/location/england</code> <code>http://mycoollocationsite.com/location/ireland</code> <code>http://mycoollocationsite.com/location/usa</code> ... atd ...</p><p>dále budete muset přidat libovolnou hodnotu, která byla do vašeho umístění předána aktuálnímu dotazu:</p><pre><code>add\_action('parse\_query', 'apply\_custom\_meta\_to\_query'); function apply\_custom\_meta\_to\_query(&amp;$query) { if (isset($query-&gt;query['location'])) { $query-&gt;query\_vars['meta\_key'] = 'location'; $query-&gt;query\_vars['meta\_value'] = $query-&gt;query['location']; unset($query-&gt;query\_vars['location']); // you don't need this } } </code></pre><p>předpokládám, že ukládáte vlastní data do pole nazvaného <code>location</code> ... takže změňte, pokud se mýlím.</p><p>to vám však umožní filtrovat archivy na základě konkrétního umístění. pokud chcete tímto způsobem povolit archivy založené na datech, které budou vyžadovat některá další pravidla v mém prvním bloku kódu (právě teď by se zobrazil seznam <em> všech </em> příspěvky s <code>location</code> meta\_key).</p><p>místo toho doporučuji použít vlastní taxonomii. je to čistší, rozšiřitelnější a vyžaduje méně vlastního kódování. to je také přesně ta situace, pro kterou byly vytvořeny vlastní taxonomie ... tak prosím, neobjevujte kolo ...</p> <p>nejlepší je vytvořit šablonu stránky s následujícím kódem. také se musíte rozhodnout, zda budete používat značku nebo kategorii. níže uvedený kód předpokládá, že používáte kategorii.</p><pre><code>&lt;div class="news"&gt; &lt;?php //the query wp\_query('showposts=5&amp;category\_name=news'); //the loop if ( have\_posts() ) : while ( have\_posts() ) : the\_post(); ?&gt; &lt;h2&gt;&lt;a href="&lt;?php the\_permalink() ?&gt;" rel="bookmark" title="permanent link to &lt;?php the\_title\_attribute(); ?&gt;"&gt;&lt;?php the\_title(); ?&gt;&lt;/a&gt;&lt;/h2&gt; &lt;div class="post\_content"&gt; &lt;?php the\_excerpt(); ?&gt; &lt;/div&gt; &lt;? endwhile; endif; //reset query wp\_reset\_query(); ?&gt; &lt;/div&gt; &lt;div class="events"&gt; &lt;?php //the query wp\_query('showposts=5&amp;category\_name=events'); //the loop if ( have\_posts() ) : while ( have\_posts() ) : the\_post(); ?&gt; &lt;h2&gt;&lt;a href="&lt;?php the\_permalink() ?&gt;" rel="bookmark" title="permanent link to &lt;?php the\_title\_attribute(); ?&gt;"&gt;&lt;?php the\_title(); ?&gt;&lt;/a&gt;&lt;/h2&gt; &lt;div class="post\_content"&gt; &lt;?php the\_excerpt(); ?&gt; &lt;/div&gt; &lt;? endwhile; endif; //reset query wp\_reset\_query(); ?&gt; &lt;/div&gt; </code></pre> <p>můžete použít funkci wordpress get\_children. i když si nemyslím, že je to rozdíl, výkon-moudrý.</p><pre><code>&lt;?php while (have\_posts()) : the\_post(); ?&gt; &lt;?php $attachment = array\_values( get\_children( array( 'post\_parent' =&gt; $post-&gt;id, 'post\_type' =&gt; 'attachment', 'post\_mime\_type' =&gt; 'image', 'order' =&gt; 'asc', 'numberposts' =&gt; 1 ) ) ); ?&gt; &lt;div class="searchitem" style="clear:both;"&gt; &lt;h3 id="post-&lt;?php the\_id(); ?&gt;"&gt; &lt;?php if( $attachment ) echo '&lt;img src="' . wp\_get\_attachment\_url($attachment[0]-&gt;id) . '" class="post-attachment" /&gt;'; ?&gt; &lt;a href="&lt;?php the\_permalink() ?&gt;" rel="bookmark" title="permanent link to &lt;?php the\_title\_attribute(); ?&gt;"&gt;&lt;?php the\_title(); ?&gt;&lt;/a&gt;&lt;/h3&gt; &lt;small&gt;&lt;?php the\_time('l, f js, y') ?&gt;&lt;/small&gt; &lt;div class="excerpt"&gt;&lt;?php echo $post-&gt;post\_excerpt; ?&gt;&lt;/div&gt; &lt;div class="postmetadata"&gt;posted in &lt;?php the\_category(', ') ?&gt; | &lt;?php comments\_popup\_link('no comments &amp;#187;', '1 comment &amp;#187;', '% comments &amp;#187;'); ?&gt;&lt;/div&gt; &lt;/div&gt; &lt;?php endwhile; ?&gt; </code></pre> Třeba pro Firefox je doplněk s názvem Check4change, který ti umožňuje označit si nějaký text na stránce a potom automaticky refreshuje po určitém čase jaký si nastavíš a kontroluje jestli se ten text změnil. To by možná mohlo být použitelné. <p>z toho, co jsem četl v popisu pluginů, je kompatibilní s wp 2.9.2. vedle toho předpokládám, že z popisu hodně souvisí. proto bych nainstaloval <a href="http://wordpress.org/extend/themes/default">výchozí (wordpress theme)</a> a zkusil, jestli to funguje s tímto motivem. možná to funguje s tímto tématem?</p><p>možná právě narazíte na chybu javascript nebo máte javascript zakázán? zkontrolujte také tyto zdroje chyb, protože je napsáno, že plugin používá ajax, což znamená javascript.</p> Zkusil bych zazálohovat a tovární nastavení.