¿Cómo conectar diferentes CPT juntos?

10

Espero que esta pregunta tenga su lugar aquí.

Siempre he pensado que conectar diferentes tipos de publicaciones personalizadas es una necesidad bastante común, como en los tutoriales populares de uso de taxonomías personalizadas (libros / autores / títulos, películas / actores / directores, etc.). Yo personalmente uso "Posts 2 Posts", pero el soporte se detuvo.

En Google, los resultados más relevantes apuntan a este complemento en este momento. ¿Qué alternativas a largo plazo existen? ¿Qué usaría un desarrollador web experimentado de WordPress para diseñar un sistema de gestión de libros / autores / títulos con WordPress hoy, si el complemento P2P está terminado?

drake035
fuente
¿Qué código usaste para crear los tipos de publicaciones personalizadas? Puede agregar soporte para crear tipos de taxonomía personalizados utilizando este código wordpress.stackexchange.com/a/128544/9884
Brad Dalton el
1
Creo que una gran cantidad de personas todavía usan p2p, por lo que no puedo ver que falle en el corto plazo, ya que alguien podría bifurcar y mantenerlo en github. Sin embargo, si se ha eliminado el soporte, supongo que solo significa que scribu está trabajando en algo nuevo o que la funcionalidad puede estar llegando al núcleo. No lo veo como una razón para no usarlo.
sanchothefat
1
No estoy tan seguro Sancho. P2P tiene solo 55,000 descargas en la página de complementos de WP, mucho menos popular de lo que pensaba. Y no entiendo por qué, una vez más, porque conectar CPT juntos me parece una necesidad muy básica y común. ¿Cómo puede un complemento que solo aborde algo tan básico podría tener solo 55,000 descargas? Eso está más allá de mí. La única explicación es que hay otra buena manera de abordarlo, de ahí mi pregunta.
drake035
3
Puede continuar usando este complemento y si el complemento falla de alguna manera, puede bifurcar el repositorio y mantenerlo usted mismo: github.com/scribu/wp-posts-to-posts.git Cita del repositorio:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay
44
Votó y destacó esta pregunta porque creo que HABTM en WordPress es realmente interesante. Dicho esto, no sudaría demasiado el plugin, Mark Jaquith se ha ofrecido voluntario para ayudar a mantenerlo en funcionamiento . Y aunque algunos complementos de WP pueden tener 300000 descargas o lo que sea, no muchos tienen 472 estrellas en github. ¡Para mantenerlo vivo, ese es el número que cuenta!
Será

Respuestas:

12

Como programador, comenzaría a escribir mi propio código para conectar mis tipos de publicaciones. No es una forma rápida, no es fácil, pero es muy divertido.

Los tipos de publicación

Comenzamos creando dos tipos de publicaciones simples Authory Books:

add_action('init', 'p2p2_register_author');
add_action('init', 'p2p2_register_book');

function p2p2_register_author(){
    $labels = array(
        'name'               => 'Author',
        'singular_name'      => 'Author',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Author',
        'edit_item'          => 'Edit Author',
        'new_item'           => 'New Author',
        'all_items'          => 'All Authors',
        'view_item'          => 'View Authors',
        'search_items'       => 'Search Authors',
        'not_found'          => 'No authors found',
        'not_found_in_trash' => 'No authors found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Authors'
    );

    register_post_type(
        'Author',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'author' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}
function p2p2_register_book(){
    $labels = array(
        'name'               => 'Books',
        'singular_name'      => 'Book',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Book',
        'edit_item'          => 'Edit Book',
        'new_item'           => 'New Book',
        'all_items'          => 'All Books',
        'view_item'          => 'View Book',
        'search_items'       => 'Search Books',
        'not_found'          => 'No books found',
        'not_found_in_trash' => 'No books found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Books'
    );

    register_post_type(
        'Book',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'book' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}

Nada lujoso allí. De hecho, es del Codex !

El metabox

Continuemos agregando un metabox para nuestro autor a nuestro tipo de publicación de libro:

add_action('admin_init', 'p2p2_add_author_metabox');

function p2p2_add_author_metabox(){
    add_meta_box( 
        'book_author', 
        __('Book Author', 'bandpress'), 
        'p2p2_book_author_metabox', 
        'book', 
        'side', 
        'default', 
        array( 'id' => 'p2p2_author') 
    );
}

Aquí puede ver una función de devolución de llamada p2p2_book_author_metaboxque será lo que está dentro de nuestro metabox.

El contenido del metabox.

Vamos a crear la función:

function p2p2_book_author_metabox($post, $args){
    wp_nonce_field( plugin_basename( __FILE__ ), 'p2p2_book_author_nonce' );
    $author_id = get_post_meta($post->ID, 'p2p2_book_author', true);

    echo "<p>Select the author of the book</p>";
    echo "<select id='p2p2_book_author' name='p2p2_book_author'>";
    // Query the authors here
    $query = new WP_Query( 'post_type=author' );
    while ( $query->have_posts() ) {
        $query->the_post();
        $id = get_the_ID();
        $selected = "";

        if($id == $author_id){
            $selected = ' selected="selected"';
        }
        echo '<option' . $selected . ' value=' . $id . '>' . get_the_title() . '</option>';
    }
    echo "</select>";
}

Aquí es donde sucede la magia. Primero vamos a consultar la base de datos de autores y luego rellenamos <select>con los resultados de nuestra consulta. Consulte el Codex para obtener más información WP_Query. Ahora puede ir al tipo de publicación de su libro y ver su menú desplegable:

Nuestro menú desplegable

Guardando nuestro contenido

Por supuesto, queremos guardar nuestra selección, así que agregamos otra función que nos va a guardar el metabox:

add_action('save_post', 'p2p2_save_author_metabox', 1, 2);

function p2p2_save_author_metabox($post_id, $post){
    // Don't wanna save this now, right?
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;
    if ( !isset( $_POST['p2p2_book_author_nonce'] ) )
        return;
    if ( !wp_verify_nonce( $_POST['p2p2_book_author_nonce'], plugin_basename( __FILE__ ) ) )
        return;

    // We do want to save? Ok!
    $key = 'p2p2_book_author';
    $value = $_POST["p2p2_book_author"];
    if ( get_post_meta( $post->ID, $key, FALSE ) ) { // If the custom field already has a value
        update_post_meta( $post->ID, $key, $value );
    } else { // If the custom field doesn't have a value
        add_post_meta( $post->ID, $key, $value );
    }
    if ( !$value ) delete_post_meta( $post->ID, $key ); // Delete if blank
}

¡Ahora ve y guarda un libro con un autor! El autor del libro se guardará en la wp_postmetatabla de la base de datos y el valor seleccionado del menú desplegable será el del meta.

Una columna de autor para el libro.

Expandamos el área de administración de nuestros libros. Comenzaremos cambiando las columnas:

add_filter('manage_edit-book_columns', 'p2p2_add_book_columns');

function p2p2_add_book_columns($columns){
    $new_columns['cb'] = '<input type="checkbox" />';

    $new_columns['title'] = _x('Title', 'column name', 'bandpress');

    $new_columns['p2p2_author'] = __('Author', 'bandpress');

    return $new_columns;
}

Esta función se asegura de que solo veamos el título de las columnas y p2p2_author. La columna de casilla de verificación cb es necesaria para la funcionalidad de edición masiva de WordPress. Ahora necesitamos agregar alguna información a nuestra columna. Agregamos esta función:

add_action('manage_book_posts_custom_column', 'p2p2_fill_book_columns', 10, 2);

function p2p2_fill_book_columns($column_name, $id) {
    global $wpdb;
    switch ($column_name) {
        case 'p2p2_author':
            $author_id = get_post_meta($id, 'p2p2_book_author', true);
            $author = get_post($author_id);
            $permalink = get_permalink($author_id);
            echo "<a href='" . $permalink . "'>" . $author->post_title . "</a>";
            break;
        default:
            break;
    } // end switch
}

El cambio es para cada columna que acaba de agregar en la función anterior. Lo llenas haciendo eco de lo que quieres mostrar. Recibimos la publicación que es el autor de nuestro libro y creamos un enlace permanente a su 'página de perfil'. Esto es lo que parece:

Nuestra columna de autor

Continuará

Conectamos dos tipos de publicaciones en el back-end de nuestro sitio de WordPress, pero no podemos ver nada en la interfaz. Necesitará mucho más trabajo para lograr esto, pero las posibilidades son infinitas. Podríamos:

  1. Ordenar libros por autor
  2. Mostrar una lista de libros en la página del autor.
  3. Mostrar una lista de otros libros del autor en la página del libro.
  4. Crea un metabox elegante con imágenes del autor
  5. Cree una columna en la página de administración del autor para los libros que escribió.
  6. Y mucho más...

Seguiré trabajando en esta respuesta, ya que necesito esta solución yo mismo. Sin embargo, dejaré de trabajar por ahora. Comenzaré a actualizar esta respuesta mañana.

Kayak de buceo
fuente
Gracias por compartir tu increíble respuesta. ¿Cómo mostrarías una lista de libros escritos por el autor?
William
4

No me preocuparía demasiado, ya que un par de grandes desarrolladores se ofrecieron como voluntarios para continuar con el soporte . Sin embargo, si desea utilizar algo más, consulte el campo de relación ACF .

Bjorn
fuente
Los enlaces solitarios y las recomendaciones de complementos se consideran respuestas de baja calidad. La razón es simple: si el enlace se ha ido, la respuesta (y este sitio) sufre la rotura del enlace.
kaiser
3
Las soluciones sin enlaces también pueden volverse obsoletas con el tiempo, y esto es peor que los enlaces muertos porque algunas personas pueden perder el tiempo tratando de implementar estas soluciones obsoletas sin saber que ya no funcionan. Además, es probable que ACF y su sitio web duren mucho tiempo. Finalmente, muchas gracias Bjorn por esta fantástica alternativa.
drake035
2

Dado que la pregunta original es "¿Qué harías si P2P desapareciera?" Tengo un pensamiento / sugerencia. Realmente necesitaba, porque si estás creando un complemento, decirle a los usuarios que instalen otro complemento no siempre es viable.

Un método simple sería usar el Post Meta. Por ejemplo. En post_meta de Author, puede almacenar los libros. Ya sea como entradas únicas o como una sola entrada separada por comas o una matriz serializada. Luego, en el libro, almacena la información inversa de los autores.

Otra sería agregar una nueva tabla de DB (mal vista) que almacena las relaciones y otra información pertinente.

No tengo idea de cuán eficiente es cualquiera de las soluciones a escala, pero funcionan.

Jeff Rose
fuente