web-dev-qa-db-fra.com

Utiliser un type de message personnalisé comme champ personnalisé

Je souhaite créer un type de publication personnalisé pour un magasin contenant tous les noms de magasin et fonctionnant correctement. Maintenant, je veux récupérer tous les magasins dans une zone de sélection dans chaque nouvelle publication de WordPress. Le nom du magasin sélectionné sera utilisé comme champ personnalisé pour cette publication. Je souhaite enregistrer ce nom de magasin en tant que méta-valeur pour cette publication dans la table wp_postmeta.

Chaque poste personnalisé ayant le post_type = 'store' alors comment j'écris une fonction pour récupérer tous les posts par type de magasin.

1
Sachin

Pour obtenir les publications d'un type de publication, vous pouvez utiliser get_posts()

$posts = get_posts(
    array (
        'numberposts'    => -1,
        'posts_per_page' => -1,
        'post_type'      => 'store'
    )
);

Attention, le -1 est dangereux: s'il y a des millions de magasins, la requête risque de rencontrer un délai d'expiration.

Voici un exemple très basique pour une telle méta-boîte. Vous trouverez beaucoup plus d'exemples et d'explications dans notre tag metabox .

<?php # -*- coding: utf-8 -*-
/* Plugin Name: Store metabox */

add_action( 'add_meta_boxes_post', 'wpse_98184_register_store_metabox' );
add_action( 'save_post', 'wpse_98184_save_store_metabox' );

function wpse_98184_register_store_metabox()
{
    add_meta_box( 'post_store', 'Store', 'wpse_98184_render_store_metabox', NULL, 'side' );
}

function wpse_98184_render_store_metabox( $object, $box )
{
    $nonce = wp_create_nonce( __FILE__ );
    echo "<input type='hidden' name='nonce_store_mbox' value='$nonce' />";

    $posts = get_posts(
        array (
            'numberposts'    => -1,
            'posts_per_page' => -1,
            'post_type'      => 'store',
        )
    );

    if ( ! $posts )
        return print 'No store found';

    $meta    = get_post_meta( $object->ID, '_store', TRUE );
    $selected = $meta ? $meta : 0;
    $html     = '<select name="_store"><option value="0">Select a store</option>';

    foreach ( $posts as $post )
        $html .= sprintf(
            '<option value="%1$d" %2$s>%3$s</option>',
            esc_attr( $post->ID ),
            selected( $post->ID, $selected, FALSE ),
            esc_html( $post->post_title )
            );

    $html .= '</select>';

    echo $html;
}

function wpse_98184_save_store_metabox( $id )
{
    if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
        return;

    if ( ! isset ( $_POST[ 'nonce_store_mbox' ] ) )
        return;

    if ( ! wp_verify_nonce( $_POST[ 'nonce_store_mbox' ], __FILE__ ) )
        return;

    if ( ! current_user_can( 'edit_post', $id ) )
        return;

    if ( ! isset ( $_POST['_store'] ) )
        return delete_post_meta( $id, '_store' );

    update_post_meta( $id, '_store', $_POST['_store'] );
}

Pour répertorier toutes ces publications associées dans une page de magasin, utilisez une fonction qui interroge les champs de méta de publication:

function wpse_98184_list_store_posts()
{
    $args = array(
        'post_type'  => 'post',
        'numberposts'    => -1,
        'posts_per_page' => -1,
        'meta_query' => array (
            array (
                'key' => '_store',
                'value'   => get_the_ID(),
                'compare' => '==',
            ),
        )
    );

    $posts = get_posts( $args );

    if ( ! $posts )
        return '';

    $output = '<ul class="store-posts">';

    foreach ( $posts as $post )
        $output .= sprintf(
            '<li><a href="%1$s">%2$s</a></li>',
            get_permalink( $post->ID ),
            esc_html( get_the_title( $post->ID ) )
        );

    $output .= '</ul>';

    return $output;
}

Vous pouvez utiliser cette fonction en tant que gestionnaire de shortcode:

add_shortcode( 'storeposts', 'wpse_98184_list_store_posts' );

Ajoutez simplement [storeposts] partout où vous avez besoin de cette liste dans votre magasin.

0
fuxia