Soporte » Plugins y Hacks » Hacks » Ordenar posts por tipos de post personalizados en un botón select

  • Resuelto Luismin

    (@luismin)


    Buenas!

    En el menu de administración de WordPress tengo creados varios «custom-posts» cada uno con sus posts. Ahora en uno de esos post personalizados he creado un campo que recupera todos los posts de los posts personalizados. El problema es que necesitaría que los ordenara de la siguiente manera:

    Post Personalizado 1:
    Posts
    Post Personalizado 2:
    Posts

    Os paso el código que crea el campo y recupera y guarda los datos de select:

    // Add the Meta Box  
    
    function add_custom_meta_box_related() {
        add_meta_box(
            'custom_meta_box_related', // $id
            'Related Information', // $title
            'show_custom_meta_box_related', // $callback
            'related', // $page
            'normal', // $context
            'high'); // $priority
    }
    add_action('add_meta_boxes', 'add_custom_meta_box_related');
    
        // Field Array
        $prefix_related = 'custom_';
        $custom_meta_fields_related = array(  
    
    		array(
    			'label' => 'Related Items',
    			'desc' => 'Select a related item(s)',
    			'id'    =>  $prefix_materiales.'post_id',
    			'type' => 'post_list',
    			'post_type' => array('products','paso1','paso2','paso3','paso4','compra'),
    )
        );  
    
    	// The Callback
    function show_custom_meta_box_related() {
    global $custom_meta_fields_related, $post;
    // Use nonce for verification
    echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';  
    
        // Begin the field table and loop
        echo '<table class="form-table">';
        foreach ($custom_meta_fields_related as $field_related) {
            // get value of this field if it exists for this post
            $meta_related = get_post_meta($post->ID, $field_related['id'], true);
            // begin a table row with
            echo '<tr>
                    <th><label for="'.$field_related['id'].'">'.$field_related['label'].'</label></th>
                    <td>';
                    switch($field_related['type']) {
                        // case items will go here 
    
    					// post_list
    					case 'post_list':
    					$items = get_posts( array (
    						'post_type' => $field_related['post_type'],
    						'posts_per_page' => -1
    					));
    					echo '<select multiple name="'.$field_related['id'].'" id="'.$field_related['id'].'">
    					<option value="">Select One or more</option>'; // Select One
    					foreach($items as $item) {
    						echo '<option value="'.$item->ID.'"',$meta_related == $item->ID ? ' selected="selected"' : '','> '.$item->post_title.'</option>';
    					} // end foreach
    					echo '</select><br /><span class="description">'.$field_related['desc'].'</span>';
    					break;
                    } //end switch
            echo '</td></tr>';
        } // end foreach
        echo '</table>'; // end table
    }
    
    // Save the Data
    function save_custom_meta_related($post_id) {
        global $custom_meta_fields_related;  
    
        // verify nonce
        if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__)))
            return $post_id;
        // check autosave
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
            return $post_id;
        // check permissions
        if ('page' == $_POST['post_type']) {
            if (!current_user_can('edit_page', $post_id))
                return $post_id;
            } elseif (!current_user_can('edit_post', $post_id)) {
                return $post_id;
        }  
    
        // loop through fields and save the data
        foreach ($custom_meta_fields_related as $field_related) {
            $old = get_post_meta($post_id, $field_related['id'], true);
            $new = $_POST[$field_related['id']];
            if ($new && $new != $old) {
                update_post_meta($post_id, $field_related['id'], $new);
            } elseif ('' == $new && $old) {
                delete_post_meta($post_id, $field_related['id'], $old);
            }
        } // end foreach
    }
    add_action('save_post', 'save_custom_meta_related');

    Supongo que en este punto

    // post_list
    case 'post_list':
    $items = get_posts( array (
    'post_type' => $field_related['post_type'],'posts_per_page' => -1));
    echo '<select multiple name="'.$field_related['id'].'"id="'.$field_related['id'].'">
    <option value="">Select One or more</option>'; // Select One
    foreach($items as $item) {
    echo '<option value="'.$item->ID.'"',$meta_related == $item->ID ? 'selected="selected"' : '','> '.$item->post_title.'</option>';
    } // end foreach

    tengo que requerir el id de cada post personalizado pero no se me ocurre cómo.

    Gracias de antemano

Viendo 2 respuestas - de la 1 a la 2 (de un total de 2)
  • Iniciador del debate Luismin

    (@luismin)

    He solucionado parte del problema y ya listo en el select los post juntos por tipo de post con esta correción en la parte del // post_list

    // post_list
    case 'post_list':
    echo '<select  multiple style="height:200px; width:300px" name="'.$field_related['id'].'" id="'.$field_related['id'].'">';
    echo '<option value=""></option>'; // Select One
    					foreach($field_related['post_type'] as $tipo_post){
    $items = get_posts( array (
    'post_type' => $tipo_post,
    'posts_per_page' => -1
    ));
    foreach($items as $item) {
    echo '<option value="'.$item->ID.'"',$meta_related == $item->ID ? ' selected="selected"' : '','> '.$tipo_post.'-'.
    $item->post_title. '</option>';
    } // end foreach
    }
    echo '</select><br /><span class="description">'.$field_related['desc'].'</span>';
    break;

    Ahora lo único que me queda es que pueda hacer una selección múltiple de los items que aparecen dentro del select. Si alguien sabe cómo hacerlo o por donde tirar soy todo oídos!!

    Saludos!

    Iniciador del debate Luismin

    (@luismin)

    // post_list
    case 'post_list_produktkrav': 
    
    $items = get_posts( array (
    								'post_type' => $field['post_type'],
    								'posts_per_page' => -1
    ));
    foreach($items as $item) {
    echo '<input type="checkbox" value="'.$item->ID.'" name="'.$field_related['id'].'[]" id="'.$item->ID.'"',$meta_related && in_array($item->ID, $meta_related) ? ' checked="checked"' : '',' />
    <label for="'.$item->ID.'">'.$item->post_title.'</label><br />';
    } // end foreach
    
    break;

    Solucionado.

Viendo 2 respuestas - de la 1 a la 2 (de un total de 2)
  • El debate ‘Ordenar posts por tipos de post personalizados en un botón select’ está cerrado a nuevas respuestas.