رفتن به مطلب

مشکل عجیب با wp_insert_post


پست های پیشنهاد شده

سلام خدمت اساتید محترم.

در فانکشن wp_insert_post به مشکل عجیبی برخوردم.


$post = array(
'post_title' => wp_strip_all_tags( $order_details['title'] ),
'post_author' => get_current_user_id(),
'post_type' => 'wp_order',
'post_status' => 'pending',
'post_date' => date( 'Y-m-d H:i:s' ),
'post_date_gmt' => date( 'Y-m-d H:i:s' )
);
$postID = wp_insert_post( $post );

if ( is_wp_error( $postID ) ) {
set_transient( 'wpo_new_order_message_' . get_current_user_id(), __( 'There was a problem to register your order. Please try again later', 'wpo' ) );
return;
}
$post_status_update = array(
'ID' => $postID,
'post_type' => 'wp_order',
'post_status' => 'pending'
);
wp_update_post( $post_status_update );

این کد من پست را به درستی ایجاد میکنه، اما هر کاری میکنه، وضعیت اون Draft هست و به هیچ عنوان هم پاک نمیشه، مگر از طریق دیتابیس. همچنین post_date هم به درستی ذخیره نمیشه.

اساتید ممنون میشم راهنماییم کنند.

لینک به ارسال

معذرت میخوام اسپم میدم، ولی کارم واقعاً فوری هست. اساتید لطفاً کم لطفی نکنند.

ویرایش شده توسط Ehsaan
لینک به ارسال

احسان جون اینو امتحان کن ببین درست میشه :


$post = array(
'post_title' => wp_strip_all_tags( $order_details['title'] ),
'post_author' => get_current_user_id(),
'post_type' => 'wp_order',
'post_status' => 'publish','post_date' => date( 'Y-m-d H:i:s' ),
'post_date_gmt' => date( 'Y-m-d H:i:s' )
);
$postID = wp_insert_post( $post );
if ( is_wp_error( $postID ) ) {
set_transient( 'wpo_new_order_message_' . get_current_user_id(), __( 'There was a problem to register your order. Please try again later', 'wpo' ) );
return;
}$post_status_update = array(
'ID' => $postID,'post_type' => 'wp_order',
'post_status' => 'publish'
);
wp_update_post( $post_status_update );

لینک به ارسال

کدی که دادند درسته و کد قبلیتون هم باید مطالب را در انتظار تایید می گذاشت اما اگر درست کار نمی کنند اول از همه کد کامل صفحه ارسال مطلب در مرحله بعد کد کامل ساخت پست تایپ wp_order و در نهایت کدهای کامل فایل functions.php باید کنترل بشند

لینک به ارسال

استاد فخار، من از تم برای کارم استفاده نمی‎کنم، از پلاگین استفاده می‎کنم. همه چیز طبیعیه. من از یه اکشن خاص که خودم ساختم استفاده می‌کنم.


function wpo_actions() {
if ( @ isset( $_REQUEST['wpo-action'] ) )
do_action( 'wpo_action_' . $_REQUEST['wpo-action'], $_REQUEST );
}
add_action( 'init', 'wpo_actions', 1 );

و بعد هر اکشنی رو که بخوام انجام بدم بهش اد می‎کنم. مثلا:


add_action( 'wpo_action_submit', 'aaa' );

فقط کافیه از طریق get یا post یه داده به اسم wpo-action و مقدار submit بفرستم تا طبق مثال بالا فانکشن aaa اجرا بشه. حالا سوال من این هست که ممکنه با توجه به اینکه من پست تایپ ها را در init هک کردم، ممکنه اشکال از اینجا باشه؟

لینک به ارسال

init بعد از اینکه کل وردپرس لود شد و قبل از ارسال header لود می شه برای submit پست مناسب نیست ولی ارتباطی با post_status نمی تونه داشته باشه مورد شما می تونه در اثر این باشه که در یک تابع دیگه یک دستور کلی برای انتقال مطالب به حالت draft وجود داشته باشه که با کدهای شما تداخل می کنه

لینک به ارسال

مشکل رفع شد. ممنون استاد فخار و کسری جان بابت پاسخ هاتون.

مشکل از متاباکس ها بود. شاید بی ربط به نظر بیاد، اما من توی پلاگین از متاباکس ها استفاده کرده بودم و یکی از متاباکس ها مربوط میشد به وضعیت پست. برای تغییر دادن وضعیت پست من یه فانکشن به save_post هک کرده بودم، بی خبر از اینکه wp_insert_post از این هک استفاده میکنه.


public function save( $post_id ) {
$post = get_post( $post_id );

if ( $post->post_type == 'wp_order' ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;

if ( ! current_user_can( 'edit_wp_orders', $post_id ) )
return $post_id;

do_action( 'wpo_before_save_order', $post );
$desc = esc_attr( $_POST['order']['desc'] );
$current_details = get_post_meta( $post_id, '_order', true );
$current_details['desc'] = $desc;
update_post_meta( $post_id, '_order', $current_details );

remove_action( 'save_post', array( $this, 'save' ) );
$status = $_POST['wpo_post_status'];
$post = array(
'ID' => $post_id,
'post_type' => 'wp_order',
'post_status' => $status
);
wp_update_post( $post );
add_action( 'save_post', array( $this, 'save' ) );

do_action( 'wpo_after_save_order', $post );

}
}

و چون موقع wp_insert_post در کدی که قبل دادم، $_POST['wpo_post_status'] خالی بود و مقداری نداشت و علاوه بر این فانکشن save گویا ارجحیت بیشتری داره، وردپرس اتوماتیک نوع draft رو براش انتخاب کرد. حالا برای آپدیت کردن استاتوس یه کاستوم پست باید از چنین چیزی استفاده کنم:


$_POST['wpo_post_status'] = ' ... status ... ';

و حالا دنبال راه حل این مشکل هستم که چطور این مشکل رو حل کنم.

لینک به ارسال

منم همین رو عرض کردم : مورد شما می تونه در اثر این باشه که در یک تابع دیگه یک دستور کلی برای انتقال مطالب به حالت draft وجود داشته باشه که با کدهای شما تداخل می کنه برای submit فرم نیازی به استفاده از اکشن نیست اصولا کمار اکشن اینه که تابع رو بدون submit فرم فعال کنه برای نام تابعتون رو در شرط اجرای فیلد بگذارید :


if(isset($_POST['insert_post_submit'])) {
do_insert_my_post();
}

و کدهای اینسرت را در یک تابع به نام do_insert_my_post قرار بدید


function do_insert_my_post() {
$my_post = array(
//متغیر ها
);
wp_insert_post($my_post);
}

برای اینیکی مشکلتون هم


if(isset( $_POST['wpo_post_status'])) {
$status = $_POST['wpo_post_status'];
}
else {
$status = publish;
}

لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...