¿Cómo conectar diferentes CPT entre sí?

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 ejemplos de tutoriales populares sobre el uso de taxonomía personalizada (libros / autores / títulos, películas / actores / directores, etc.). Personalmente uso "Posts 2 Mensajes", 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 experimentado desarrollador web de WordPress para diseñar un sistema de gestión de libros / autores / títulos con WordPress hoy, si el complemento P2P está terminado?

    
pregunta drake035 12.01.2014 - 23:35

3 respuestas

10

Como programador, comenzaría a escribir mi propio código para conectar mis tipos de publicación. 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, Author y 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 de lujo allí. De hecho, ¡es del códice !

El metabox

Continuemos agregando un metabox para nuestro autor al tipo de publicación de nuestro 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_metabox que 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 ocurre la magia. Primero, consultaremos la base de datos de los autores y luego rellenaremos un <select> con los resultados de nuestra consulta. Consulte el Codex para obtener más información sobre WP_Query . Ahora puede ir al tipo de publicación de su libro y ver su menú desplegable:

Guardandonuestrocontenido

Porsupuesto,queremosguardarnuestraselección,asíqueagregamosotrafunciónqueguardaráelmetaboxparanosotros:

add_action('save_post','p2p2_save_author_metabox',1,2);functionp2p2_save_author_metabox($post_id,$post){//Don'twannasavethisnow,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;//Wedowanttosave?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 tabla de base de datos wp_postmeta y el valor seleccionado de la lista desplegable será el que aparece en el 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 el autor p2p2. La columna de la casilla de verificación cb es necesaria para la funcionalidad de edición masiva de WordPress. Ahora necesitamos agregar algo de información a nuestra columna. Añadimos 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 interruptor 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 buen enlace permanente a su 'página de perfil'. Esto es lo que parece:

Continuará

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

  1. Ordenar los 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, voy a dejar de trabajar en por ahora. Empezaré a actualizar esta respuesta mañana.

    
respondido por el Scuba Kay 23.01.2014 - 01:48
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 otra cosa, consulte el campo de relación ACF .

    
respondido por el Bjorn 19.01.2014 - 08:26
2

Dado que la pregunta original es "¿Qué harías si el P2P se fuera?" Tengo un pensamiento / sugerencia. Realmente lo 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 Post Meta. Por ejemplo. En la post_meta de Autor, puedes guardar los libros. Ya sea como entradas únicas o como una sola entrada separada por comas o como una matriz serializada. Luego, en el libro, almacena la información inversa de los autores.

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

No tengo idea de cuán eficiente es la solución a escala, pero funcionan.

    
respondido por el Jeff Rose 21.01.2014 - 01:28

Lea otras preguntas en las etiquetas