Publicación insertada programáticamente en WordPress no aparece en el perfil del autor

18 jun 2022, 14:17:53
Vistas: 74
Votos: 1

He insertado una publicación programáticamente en WordPress. Al ver la publicación en la página del autor, no aparece la publicación que inserté programáticamente, pero cuando actualizo manualmente la publicación, funciona y se muestra correctamente. ¿Cuál será la causa y cómo solucionarlo? ¿Alguna guía?

Código en mi plugin:

add_action('wp_ajax_insert_data_to_post_type_func', 'insert_data_to_post_type_func');

function insert_data_to_post_type_func(){
    global $wpdb;
    $table_name = $wpdb->prefix . 'ebay_listings';
    $select_query =  $wpdb->get_results("SELECT * FROM $table_name LIMIT 1");
    $user_id_get = $_POST['userID'];
    foreach ($select_query as $sq) {
        
        $heading = $sq->title;
        $x = json_decode($heading);

        $des = $sq->long_desctiption;
        $y = json_decode($des);
        $z = json_decode($sq->add_id);
        $imgs = json_decode($sq->image_URL);
        $date = json_decode($sq->date);
        $location = json_decode($sq->location);
        $list_items = json_decode($sq->list_items);
        $price = json_decode($sq->price);

        foreach ($x as $tx) {
            $title[] = $tx;
        }
        foreach ($y as $lng_des) {
            $description[] = $lng_des;
        }

        foreach ($z as $add) {
            $add_id[] = $add;
        }
        foreach ($date as $dt) {
            $eb_date[] = $dt;
        }
        foreach ($location as $loc) {
            $locality[] = $loc;
        }
        foreach ($list_items as $lit) {
            $listings[] = $lit;
        }
        foreach ($price as $p) {
            $pricing[] = $p;
        }
        $i = -1;
      
        foreach ($imgs as $sd) {
          
            $i++;
            $image_name = basename($sd);
           
            $advert_posts = array(
                'post_author' => $user_id_get,
                'post_type' => 'advert',
                'post_title' => $title[$i],
                'post_content' => $description[$i] . $listings[$i],
                'post_status' => 'publish',
            );
            $post_id = wp_insert_post($advert_posts);
            $category_id = 877;
            $taxonomy = 'advert-category';
            wp_set_object_terms( $post_id, array( $category_id ), $taxonomy , true );
            add_post_meta( $post_id , 'advert_sale_price' , $pricing[$i]);
            add_post_meta( $post_id , 'advert_type' , 1);
            add_post_meta( $post_id , 'advert_negotiable' , 1);
            add_post_meta( $post_id , 'advert_location' , $locality[$i]);
            
            var_dump( get_post_field( 'post_author', $post_id ), $user_id_get);
            
            $upload = wp_upload_bits($image_name, null, file_get_contents($sd, FILE_USE_INCLUDE_PATH));
            $imageFile = $upload['file'];
            $wpFileType = wp_check_filetype($imageFile, null);
          
            // Configurar metadatos para la galería
            $attachment = array(
                'post_mime_type' => $wpFileType['type'],  // tipo de archivo
                'post_title' => sanitize_file_name($imageFile),  // sanitizar y usar nombre de imagen como nombre de archivo
                'post_content' => '',  // podría usar la descripción de la imagen como contenido
                'post_status' => 'inherit'
            );
            $attachmentId = wp_insert_attachment($attachment, $imageFile, $post_id);

            // insertar y devolver metadatos del adjunto
            $attachmentData = wp_generate_attachment_metadata($attachmentId, $imageFile);

            // actualizar y devolver metadatos del adjunto
            wp_update_attachment_metadata($attachmentId, $attachmentData);
            // finalmente, asociar ID de adjunto al ID de publicación
            $success = set_post_thumbnail($post_id, $attachmentId);
            add_post_meta( $post_id , 'advert_gallery' , set_post_thumbnail($post_id, $attachmentId));
            
            if ($success) {
                echo 'Datos e imágenes han sido insertados';
            } else {
                echo 'Algo salió mal';
            }
        }
        wp_die();
    }
}
ubaid ismail
ubaid ismail
11
Comentarios

¿Cómo estás definiendo el $user_id_get - dónde está el código para eso? ¿Y dónde se ejecuta el código de tu plugin - en qué página (¿una página de administración?) y está el código en una función enganchada a algún hook - si es así, ¿qué hook es?

Sally CJ Sally CJ
18 jun 2022 15:19:53

En realidad, es un envío de formulario que obtiene el ID del usuario marcado. No estoy usando ningún hook. Se ejecuta al enviar el formulario con ajax. @SallyCJ

ubaid ismail ubaid ismail
18 jun 2022 16:06:00

¿Cómo funciona el envío - el formulario, a través de AJAX, envía a la misma página, un archivo PHP personalizado como example.com/process.php, o al archivo admin-ajax.php? Y sospechaba que el autor de la publicación no se está estableciendo, así que prueba var_dump( get_post_field( 'post_author', $post_id ), $user_id_get ); justo después de la llamada a wp_insert_post(). ¿Cuál es la salida del dump?

Sally CJ Sally CJ
18 jun 2022 16:49:11

El formulario se envía a través de wp-ajax.php y la publicación se asigna correctamente al autor porque he rastreado las publicaciones de cada usuario mediante get_userdata(user_id). y tiene la misma publicación que asigné a ese usuario.

ubaid ismail ubaid ismail
18 jun 2022 18:50:31

"la publicación está asignada correctamente al autor" - ¿estás seguro de que está asignada al $user_id_get? ¿Puedes simplemente hacer un var_dump() y ver qué muestra? Y si los valores son correctos, entonces quizás deberías intentar desactivar plugins y/o cambiar a un tema predeterminado (por ejemplo, 2021), y ver si eso ayuda.

Sally CJ Sally CJ
19 jun 2022 08:02:56

Ejecuté var_dump() y muestra correctamente el ID de usuario, pero intenté desactivar plugins y cambiar de tema y aún no pude encontrar nada.

ubaid ismail ubaid ismail
19 jun 2022 11:16:12

Cuando dijiste "página de los autores", ¿te referías a las páginas predeterminadas de "autor" como example.com/author/admin, cierto? Además, ¿has considerado usar la API REST en su lugar? (Para crear el post del CPT) Y mencionaste "El formulario se envía a través de wp-ajax.php", pero ¿qué es wp-ajax.php? ¿Quisiste decir el hook wp_ajax_? Si es así, ¿puedes mostrar tu código completo de callback?

Sally CJ Sally CJ
19 jun 2022 14:05:10

Sí, he editado el código anterior, por favor revísalo.

ubaid ismail ubaid ismail
19 jun 2022 15:38:14

En realidad, el problema es que el post no se inserta en la base de datos hasta que hago clic manualmente en el botón de actualización en la pantalla de edición del post.

ubaid ismail ubaid ismail
20 jun 2022 00:20:57

Bueno, ahora me estoy confundiendo... pero lo que puedo sugerir es habilitar WP_Error, es decir, establecer el segundo parámetro para wp_insert_post() como true - $post_id = wp_insert_post($advert_posts, true); - y luego justo debajo/después de eso, hacer algo como if ( is_wp_error( $post_id ) ) { echo 'post no creado: ' . $post_id->get_error_message(); continue; }. Eso te ayudará a confirmar si el post se está insertando correctamente en la base de datos o no. También ten en cuenta que los CPT (tipos de contenido personalizados) por defecto no están incluidos en la consulta principal en las páginas de "autor", pero supongo que ya lo tienes manejado.

Sally CJ Sally CJ
20 jun 2022 16:22:39

¿Y dónde está el formulario en cuestión? ¿Está en la pantalla de edición de entradas o en una página de administración personalizada? ¿Cómo estás añadiendo el formulario (qué hooks usas, si es el caso), o te referías en realidad al formulario de edición de entradas - y si es así, ¿es el editor clásico o el editor de bloques/Gutenberg? ¿Y cómo se activa el AJAX - automáticamente (en segundo plano) o mediante un clic en un botón, o?

Sally CJ Sally CJ
20 jun 2022 16:25:37

Problema resuelto: había un campo de metabox obligatorio que debía rellenarse para poder añadir el post en la base de datos.

ubaid ismail ubaid ismail
21 jun 2022 15:09:37
Mostrar los 7 comentarios restantes