web-dev-qa-db-ja.com

サブヘッドを返すオプションで 'the_title'をフィルタリングしますか?

問題:

WordPress iPhoneアプリ(および他のWordPress関連のスマートフォンアプリ)では、[タイトル]および[本文]以外の項目(カスタム項目にアクセスできない)以外は許可されていません。

ゴール:

私の現在のプロジェクトでは、モバイルブロガーに自分のモバイル(およびデスクトップ)投稿にサブヘッドを含めるオプションを提供する必要があります。

溶液:

タイトルにオプションの区切り文字を使用したいのですが。例:

主な見出し|副見出し

スクリーンショット:

enter image description here

|はメインタイトルを区切る区切り文字です。

主な見出し

...小見出しから:

副見出し

コード要件

"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

}

結論:

まあ、正直なところ、私はあなたが私が結論を見つけるのを手伝うことができるだろうと願っています。 :)


アップデート(2013/05/14):

下記の私の 答えを見てください

考え:

  • 基本的な論理は改善できましたか?
  • より効果的な方法はありますか。
2
mhulse

私はあなたの問題を正しく理解しているかどうかわからないが、私の推測はあなたの難問である - あなたがどこでもそれをフィルタリングしているなら、あなたのフィルタによって変わらないタイトルに到達する方法?

Postオブジェクトから生のコピーを取得するために get_post_field() 関数を使うことができます。

しかし、出力をめちゃくちゃにする(そして保存されたデータを存在するフィルタに依存させる)代わりに、ポストを保存するときにタイトルを分割することに取り組むことをお勧めします。

4
Rarst

に基づく@Rarstのこの素晴らしいヒント

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; ?>

動作しているようです。しかし、徹底的なテストをする時間はまだありません。

改善のためのアイデア:

  1. 単純なOOPに変換する必要があります "プラグイン。 下記の2013/05/15の更新を参照してください。
  2. wp_title() のように、add_filterの影響を受けない他の関数を説明するthe_titlesを組み込みます。 @ DanStefancuのコメントのおかげで、私はsingle_post_titleをフィルタリングすることによってこのコーナーケースをカバーしました。
  3. その他?

2013/05/15更新

このコード用の プラグインを作成してここに置きました (私はフィードバックを受け付けています)。これは私の最初のWPプラグインです(これはかなり改善されるかもしれません)ので、親切にしてください。 :)

0
mhulse