web-dev-qa-db-fra.com

Comment ajouter par programme des éléments de contenu à un type de publication personnalisé?

J'ai un type de publication personnalisé dans lequel j'aimerais importer des données par programme. J'ai suivi ces instructions et ces , et je peux facilement le faire pour WP pages et publications types.

Cependant, mon type de publication personnalisé comporte des champs personnalisés, par exemple, longitude et latitude. Comment puis-je comprendre comment ces noms (clés de tableau) doivent être référencés dans le tableau post?

$defaults = array(
            'comment_status' => 'closed',
            'ping_status' => 'closed',
            'post_author' => $author_id,
            'post_name' => $slug,
            'post_title' => $title,
            'post_status' => 'publish',
            'post_type' => 'custom-post-type',
       longitude => $my_long,   // <- what's the key here?
       latitude  => $my_lat     // <- what's the key here?
            );

$images = array_of_images; // <- how do these get added?

Il y a environ 40 champs supplémentaires auxquels je dois ajouter des données.

En outre, chacun de mes éléments de contenu comporte des images jointes et je souhaite également les ajouter par programme (à partir d'une URL ou de mon disque dur local, quelle que soit l'approche choisie).

En guise de réponse, je recherche un script très simple, mais pleinement fonctionnel (ou au moins un pseudo-code complet) qui prend en compte toutes les étapes de programmation que je dois suivre pour insérer un message dans la base de données avec son image associée. pièces jointes. Le résultat devrait être le même que si je remplissais tous les champs, les médias téléchargés et si je cliquais sur "Publier" dans Wordpress.

3
user658182

Vous devez d’abord exécuter la wp_insert_post() qui renverra l’ID de publication. Ensuite, utilisez cet ID de publication pour ajouter vos champs personnalisés. Utilisez add_post_meta() pour ajouter les champs personnalisés.

$post_id = wp_insert_post( $args );

add_post_meta( $post_id, 'longitude', $my_long );
add_post_meta( $post_id, 'latitude', $my_lat );

Pour les images jointes, vous pouvez vous référer à cette question: Comment définir par programme l'image sélectionnée pour une publication personnalisée de l'extérieur

9
RRikesh

Complètement non testé mais je viens de jeter ceci ensemble:

$post_data = array (
    'comment_status'    => 'closed',
    'ping_status'       => 'closed',
    'post_author'       => $author_id,
    'post_name'         => $slug,
    'post_title'        => $title,
    'post_status'       => 'publish',
    'post_type'         => 'custom-post-type', 
);

$post_ID = wp_insert_post( $post_data );

if ( ! is_wp_error( $post_ID ) ) {

    $post_meta = get_post_meta( $post_ID );

    if ( $post_meta ) {

        foreach ( $post_meta as $key => $value ) {

            if ( preg_match('/(\.jpg|\.png)$/', $value ) {

                $file = file_get_contents( $value );

                $tmpfname = tempnam( '/tmp',  'img' );

                $handle = fopen( $tmpfname );

                fwrite( $handle, $file );

                if ( getimagesize( $tmpfname ) ) {

                    $image_url  = $value;
                    $upload_dir = wp_upload_dir();
                    $image_data = file_get_contents( $image_url );

                    $filename   = end( explode( '/', $image_url ) );
                    $fileName   = end( explode( '/', $filename ) );

                    $uploadDir  = end( explode( 'uploads', $imageUrl ) );
                    $uploadDir  = str_replace( $fileName, '', $uploadDir );

                    $filename   = $fileName;

                    if ( wp_mkdir_p( $upload_dir['path'] ) ) {

                        $file = $upload_dir['basedir'] . $uploadDir . $filename;

                    } else {

                        $file = $upload_dir['basedir'] . $uploadDir . $filename;
                    }

                    file_put_contents( $file, $image_data );

                    $wp_filetype = wp_check_filetype( $filename, null );

                    $attachment = array (
                        'post_mime_type'    => $wp_filetype['type'], 
                        'post_title'        => sanitize_file_name( $filename ), 
                        'post_content'      => '', 
                        'post_status'       => 'inherit',
                    );

                    $attach_id = wp_insert_attachment( $attachment, $file, $post_ID );

                    // Include image.php
                    require_once(ABSPATH . 'wp-admin/includes/image.php');

                    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );

                    wp_update_attachment_metadata( $attach_id, $attach_data );

                }

                fclose( $handle );

            } else {

                add_post_meta( $post_ID, $key, $value );

            }

        }

    }

}

Le code devrait être auto-documenté, mais n'hésitez pas à demander si vous avez des questions ou si cela ne fonctionne pas.

1
jacobwarduk
<?php
require_once 'wp-load.php'; //path of wp-load.php

$name = 'my post';
$content = 'dummy Content here';
$featured_image = 'fullimage url.jpg'; //pass here full image url

$post_data = array(
    'post_title'    => wp_strip_all_tags( $name ),
    'post_content'  => $content,
    'post_status'   => 'publish',
    'post_type'     => 'post',
    'post_author'   => 1,
    'post_category' => array(1,2),
    'page_template' => ''
);
$post_id = wp_insert_post( $post_data, $error_obj );

// for custom field
//add_post_meta( $post_id, 'post_date', 'Dec 5, 2018' ); // second parameter is your custom field name, 3rd parameter is value

generate_Featured_Image($featured_image, $post_id );

function generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if(wp_mkdir_p($upload_dir['path']))
        $file = $upload_dir['path'] . '/' . $filename;
    else
        $file = $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
    echo 'post created...';
}
?>
0
Vajirali Asamadi

Insérer et mettre à jour après par programme. http://www.pearlbells.co.uk/insert-udpate-wordpress-post-programmatically/

 if( $mydb->num_rows >  0) {

    echo 'Post '.$postCSVContent[0].' exist'.PHP_EOL;
    $template_file = get_post_meta( $postCSVContent[0], '_wp_page_template', true );
    echo 'Template File : '.$template_file.PHP_EOL;

    $updatePost = array(   
        'ID' => $postCSVContent[0],
        'post_title'    => $postCSVContent['1'],
        'post_content'  => $postCSVContent['2'],
        'post_type' => 'doors',
        'post_status'   => 'publish',
        'post_author'   => 1
    );

    wp_update_post( $updatePost );

    update_post_meta( $postCSVContent[0], '_wp_page_template', $template_file );
    updateAcf( $postCSVContent , $postCSVContent[0] );

}
else
{
    echo 'Post '.$postCSVContent[0].' is not existing'.PHP_EOL;        
    echo 'Post parent '.$parentId.PHP_EOL;

    $newIds = wp_insert_post( array(
            'post_title' => $postCSVContent['1'],
            'post_content' => $postCSVContent['2'],
            'post_type' => 'doors',
            'post_status' => 'publish',        
            'post_author'   => 1,
            'post_parent' => $parentId
    ));

    updateAcf( $postCSVContent , $newIds );

Veuillez vous référer au tutoriel qui met à jour acf également. http://www.pearlbells.co.uk/insert-update-acf-image-repeater-field-programmatically/

0
Liz Eipe C