WordPress iPhoneアプリ(および他のWordPress関連のスマートフォンアプリ)では、[タイトル]および[本文]以外の項目(カスタム項目にアクセスできない)以外は許可されていません。
私の現在のプロジェクトでは、モバイルブロガーに自分のモバイル(およびデスクトップ)投稿にサブヘッドを含めるオプションを提供する必要があります。
タイトルにオプションの区切り文字を使用したいのですが。例:
主な見出し|副見出し
スクリーンショット:
|
はメインタイトルを区切る区切り文字です。
主な見出し
...小見出しから:
副見出し
"title" - getting WPメソッドを使用するすべての組み込みコードおよびプラグインコードは、常に区切り文字の前の半分を返す必要があります(上記の例を使用)。 :
主な見出し
言い換えれば、デフォルトで、noのタイトル取得関数は次のように返されます。
|副見出し
すぐ下のコードは簡単な出発点です。
ご覧のとおり、私はthe_title
をフィルタリングして次のものを削除しています。
|副見出し
/**
* Head/deck handling.
*
* Unaltered title (no quotes): "Main headline | Secondary headline"
*
* @see http://stackoverflow.com/a/16279114/922323
* @see http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/post-template.php#L118
* @see https://wordpress.stackexchange.com/questions/45589/
*/
function foo_the_title($title, $id) {
return trim(current(explode('|', $title))); // Returns: "Main headline".
}
add_filter('the_title', 'foo_the_title', 10, 2);
上記のようにすることで、他の関数がデリミタ(とそれに続くもの)を吐き出すことを心配する必要がなくなります。私はすべての "タイトル"を取得する関数/メソッドがフィルタthe_title
の影響を受けると思いますか?たぶん私はここでコーナーケースを逃している? 更新:私は稀なケースを見つけました: wp_title() ...他に何があるのか疑問に思いますか?
私は立ち往生しているヘレス。
タイトルの後半部分を返すようなカスタム関数(またはfilter/other)を書くにはどうすればいいですか?
私はこれで遊んでいました:
function foo_the_subheadline() {
return apply_filters('the_title', ' My Custom Title (tm) | after the stuff ');
}
明らかに、それは有用なことは何もしていません(foo_the_title()
の中のcode/$title
変数を操作する能力が必要です)。
たとえば、私が本当にやりたいことは、次のようなものです(疑似コードが続きます。は、実際には使用しないでください)。
function foo_the_title($title, $id, $part = 'current') {
return trim($part(explode('|', $title)));
}
add_filter('the_title', 'foo_the_title', 10, 3);
function foo_get_me_the_subheadline() {
foo_the_title(pass the title here, pass the id?, 'end'); // Using variable function: http://php.net/manual/en/functions.variable-functions.php
}
まあ、正直なところ、私はあなたが私が結論を見つけるのを手伝うことができるだろうと願っています。 :)
下記の私の 答えを見てください 。
考え:
私はあなたの問題を正しく理解しているかどうかわからないが、私の推測はあなたの難問である - あなたがどこでもそれをフィルタリングしているなら、あなたのフィルタによって変わらないタイトルに到達する方法?
Postオブジェクトから生のコピーを取得するために get_post_field()
関数を使うことができます。
しかし、出力をめちゃくちゃにする(そして保存されたデータを存在するフィルタに依存させる)代わりに、ポストを保存するときにタイトルを分割することに取り組むことをお勧めします。
get_post_field() 関数を使用して、ポストオブジェクトからその生のコピーを取得できます。
これは私が今平手打ちしたばかりの(可能な)解決策です:
/**
* Head/deck handling.
*
* Unaltered example title (no quotes): "First half | Second half"
*
* @see http://stackoverflow.com/a/16279114/922323
* @see http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/post-template.php#L118
* @see https://wordpress.stackexchange.com/questions/45589/
* @see https://wordpress.stackexchange.com/questions/99039/
*/
/**
* Private helper function to return a title or deck from the title field.
*
* @param $title { string } The `post_title`.
* @param $part { string } One of "current" or "end". Default: 'current'.
* @param $delim { string } Delimiter that separates title from deck.
* @return { string } Title before or after delimiter.
*/
function _foo_the_title_and_deck($title, $part = 'current', $delim = '|') {
# ((if there's no delim) ? (if the deck is requested return an empty string, otherwise return the unaltered title) : return the filtered title or deck)
return (( ! strpos($title, $delim)) ? (($part == 'end') ? '' : $title) : trim($part(explode($delim, $title))));
}
/**
* Filter the `post_title`.
*
* @param $title { string } The post title.
* @return { string } The filterd post title.
*/
function foo_the_title($title) {
return _foo_the_title_and_deck($title);
}
# Filter `the_title`:
add_filter('the_title', 'foo_the_title', 10, 1); // Is "10" an optimal priority in this case?
# Filter `single_post_title`:
add_filter('single_post_title', 'foo_the_title', 10, 1); // IBID?
/**
* Filter the "deck" from the `post_title`.
*
* @param $post_id { integer } Optional post ID. Default: FALSE.
* @return { string } The deck from the post's title.
*/
function foo_the_deck($post_id = FALSE) {
# Use or get the $post_id:
$post_id = ($post_id) ? $post_id : get_the_ID();
return _foo_the_title_and_deck(get_post_field('post_title', $post_id), 'end');
}
/**
* Check for the existence of a deck.
*
* @param $post_id { integer } Optional post ID. Default: FALSE.
* @return { boolean } TRUE if deck exists, otherwise FALSE.
*/
function foo_has_deck($post_id = FALSE) {
if (foo_the_deck($post_id)) return TRUE;
}
テンプレートレベルでの使用法
<h1><?=the_title()?></h1>
<?php if (foo_has_deck()): ?>
<h2 class="sh4"><?=foo_the_deck()?></h2>
<?php endif; ?>
動作しているようです。しかし、徹底的なテストをする時間はまだありません。
改善のためのアイデア:
add_filter
の影響を受けない他の関数を説明するthe_title
sを組み込みます。single_post_title
をフィルタリングすることによってこのコーナーケースをカバーしました。このコード用の プラグインを作成してここに置きました (私はフィードバックを受け付けています)。これは私の最初のWPプラグインです(これはかなり改善されるかもしれません)ので、親切にしてください。 :)