¿Filtrando 'the_title' con la opción de devolver el subtítulo?

2

Problema:

La aplicación para iPhone de WordPress (y otras aplicaciones para teléfonos inteligentes relacionadas con WordPress) no permite mucho más que los campos Título y Cuerpo (es decir, no tiene acceso a campos personalizados).

Objetivo:

Mi proyecto actual requiere que demos a nuestros bloggers móviles la opción de incluir un subtítulo con sus publicaciones móviles (y de escritorio).

Solución:

Me gustaría usar un delimitador opcional en el título. Ejemplo:

  

Titular principal | Titular secundario

Captura de pantalla:

Donde|eseldelimitadorqueseparaeltítuloprincipal:

  

Titularprincipal

...desdeelsubtítulo:

  

Titularsecundario

Requisitosdelcódigo:

Todosintegrado,yelcódigodelpluginqueusa"título" - para obtener los métodos de WP siempre debe regresar la mitad antes del delimitador (usando el ejemplo de arriba):

  

Titular principal

En otras palabras, por defecto , no las funciones de obtención de títulos nunca volverán:

  

| Titular secundario

Mi código hasta ahora:

El código inmediatamente debajo es un simple punto de partida.

Como puedes ver, estoy filtrando the_title y eliminando:

  

| Titular secundario

/**
 * 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);

Al hacer lo anterior, evito tener que preocuparme por cualquier otra función que salga del delimitador (y las cosas que lo siguen), ¿verdad? Estoy asumiendo que todas las funciones / métodos de "título" se verán afectados por el filtro the_title ? Tal vez me estoy perdiendo un caso de la esquina aquí? ACTUALIZACIÓN: encontré un caso de esquina: wp_title () ... ¿Me hace preguntarme qué más hay ahí fuera?

Preguntas:

Aquí está donde estoy atrapado.

¿Cómo puedo escribir una función personalizada (o filtro / otro) que devolverá la segunda mitad del título?

Estaba jugando con esto:

function foo_the_subheadline() {

    return apply_filters('the_title', '  My Custom Title (tm)  | after the stuff    ');

}

Obviamente, eso no hace nada útil (necesito la capacidad de manipular la variable code / $title en foo_the_title() ).

Por ejemplo, lo que realmente me gustaría hacer es algo como esto (sigue el pseudo código, no usar en el mundo real ):

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

}

Conclusión:

Bueno, honestamente, espero que puedas ayudarme a encontrar una conclusión. :)

ACTUALIZACIÓN (2013/05/14):

Vea mi respuesta a continuación .

Thhutts:

  • ¿Podría mejorarse la lógica fundamental?
  • ¿Existen enfoques alternativos que podrían funcionar mejor?
pregunta mhulse 10.05.2013 - 21:03

2 respuestas

4

No estoy seguro de entender bien tu problema, pero mi conjetura es tu acertijo: ¿cómo llegar al título que no ha cambiado tu filtro, si lo estás filtrando en todas partes?

Puede utilizar la función get_post_field() para obtener una copia en bruto del objeto de la publicación.

Sin embargo, en lugar de alterar la salida (y hacer que sus datos guardados dependan de la presencia de los filtros) recomendaría trabajar en la división de un título al guardar la primera parte al título como es habitual y guardar la segunda parte en un campo personalizado.

    
respondido por el Rarst 10.05.2013 - 23:29
0

Basado en este impresionante consejo por @Rarst :

  

Puede utilizar la función get_post_field () para obtener una copia sin formato del objeto post.

Aquí hay una (posible) solución que acabo de juntar:

/**
 * 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;

}

Uso en el nivel de plantilla:

<h1><?=the_title()?></h1>

<?php if (foo_has_deck()): ?>

    <h2 class="sh4"><?=foo_the_deck()?></h2>

<?php endif; ?>

¡Parece funcionar! Sin embargo, aún no he tenido tiempo de hacer pruebas exhaustivas.

Ideas para mejorar:

  1. Convertir a OOP simple "debe usar" el complemento. Consulte 2013/05/15 a continuación.
  2. Incorpore add_filter s que tenga en cuenta otras funciones no afectadas por the_title , como wp_title () . Gracias al comentario de @ DanStefancu, he cubierto este caso de esquina filtrando single_post_title .
  3. ¿Otro?

ACTUALIZACIÓN 2013/05/15

He creado un complemento para este código y lo puse aquí (estoy abierto a comentarios). Es mi primer complemento de WP, (sé que podría mejorarse considerablemente), así que por favor sea amable. :)

    
respondido por el mhulse 14.05.2013 - 22:23

Lea otras preguntas en las etiquetas