কাস্টম ক্ষেত্রগুলি সংরক্ষণ করার সময় বৈধতা এবং ত্রুটি পরিচালনা পরিচালনা যোগ করবেন?


27

আমার একটি ফাংশন রয়েছে যা একটি পোস্টের প্রকারে একটি কাস্টম ক্ষেত্রকে সংজ্ঞায়িত করে। ক্ষেত্রটি "সাবহেড" বলুন।

পোস্টটি যখন সংরক্ষণ করা হয়, আমি ইনপুটটিতে কিছু বৈধতা করতে চাই এবং প্রয়োজনে পোস্ট সম্পাদনা পর্দায় একটি ত্রুটি বার্তা প্রদর্শন করি। কিছুটা এইরকম:

// Handle post updating
function wpse_update_post_custom_values($post_id, $post) {

    // Do some checking...
    if($_POST['subhead'] != 'value i expect') {

        // Add an error here
        $errors->add('oops', 'There was an error.');

    }

    return $errors;

} 
add_action('save_post','wpse_update_post_custom_values',1,2);

আমি এটি save_post ক্রিয়ায় আটকানোর চেষ্টা করছি, তবে কীভাবে ত্রুটিগুলি পরিচালনা করব তা আমি বুঝতে পারি না। ফাংশনটিতে কোনও ত্রুটিযুক্ত বস্তু পাস হয়েছে বলে মনে হচ্ছে না, এবং যদি আমি আমার নিজের ডাব্লুপি_আররর আপত্তি তৈরি করি এবং এটি ফিরিয়ে দিই তবে পোস্ট সম্পাদনা পৃষ্ঠায় যে কোনও প্রক্রিয়া ত্রুটি ছুঁড়েছে তার দ্বারা এটি সম্মানিত নয়।

আমার বর্তমানে আমার কাস্টম মেটা বাক্সের ভিতরে অন-পৃষ্ঠার ত্রুটি বার্তা রয়েছে তবে এটি আদর্শের চেয়ে কম নয় - আমার পরিবর্তে ডাব্লুপি'র মতো একটি বড়, লাল, উপরে-শীর্ষে ত্রুটি থাকে normal

কোন ধারনা?

হালনাগাদ:

@ ডেনিসের উত্তরের ভিত্তিতে আমি কয়েকটি ভিন্ন জিনিস চেষ্টা করেছি। গ্লোবাল হিসাবে ত্রুটিগুলি সংরক্ষণ করে এটি কাজ করে না, কারণ ওয়ার্ডপ্রেস সেভ_পোস্ট প্রক্রিয়া চলাকালীন পুনর্নির্দেশ করে যা আপনি এটি প্রদর্শনের আগে বিশ্বব্যাপী হত্যা করে।

আমি তাদের একটি মেটা মাঠে সংরক্ষণ করে শেষ করেছি। এর সাথে সমস্যাটি হ'ল আপনাকে এগুলি পরিষ্কার করতে হবে, অথবা আপনি অন্য পৃষ্ঠায় নেভিগেট করার সময় সেগুলি চলে যাবে না, তাই আমাকে অ্যাডমিন_ফুটারের সাথে যুক্ত অন্য একটি ফাংশন যুক্ত করতে হয়েছিল যা কেবল ত্রুটিগুলি পরিষ্কার করে দেয়।

আমি এতটা সাধারণ (পোস্ট আপডেট করা) এমন কিছু করার জন্য ত্রুটিটি পরিচালনা করার বিষয়টি আশা করি না। আমি কি স্পষ্ট কিছু অনুপস্থিত বা এটি সেরা পদ্ধতির?

// Handle post updating
function wpse_5102_update_post_custom_values($post_id, $post) {

    // To keep the errors in
    $errors = false;

    // Do some validation...
    if($_POST['subhead'] != 'value i expect') {

        // Add an error here
        $errors .= 'whoops...there was an error.';

    }

    update_option('my_admin_errors', $errors);

    return;

} 
add_action('save_post','wpse_5102_update_post_custom_values',1,2);


// Display any errors
function wpse_5102_admin_notice_handler() {

    $errors = get_option('my_admin_errors');

    if($errors) {

        echo '<div class="error"><p>' . $errors . '</p></div>';

    }   

}
add_action( 'admin_notices', 'wpse_5102_admin_notice_handler' );


// Clear any errors
function wpse_5102__clear_errors() {

    update_option('my_admin_errors', false);

}
add_action( 'admin_footer', 'wpse_5102_clear_errors' );

ভাল প্রশ্ন. আমি মনে করি আপনি admin_footerযদি আপনার বিজ্ঞপ্তি হ্যান্ডলারের ফাংশন শেষে ত্রুটিগুলি পরিষ্কার করেন তবে আপনি হুক থেকে মুক্তি পেতে পারেন । জিনিসকে কিছুটা সরল করে।
জির্ট

আপনি কীভাবে ফর্ম ক্ষেত্রগুলি (সম্ভাব্য অবৈধ ডেটা সহ) পুনরায় সাজানো নিয়ে কাজ করছেন?
গিরট

আমার একটি বেসিক প্রশ্ন আছে। এটি কোন ওয়ার্ডপ্রেস পিএইচপি ফাইলের মধ্যে রয়েছে?

@ ক্যারেন এটি একটি কাস্টম প্লাগইন ফাইলে বা আপনার ফাংশন.এফপি হবে।
ম্যাথসম্যাথ

আমি সম্ভবত কিছু স্পষ্টরূপে অনুপস্থিত, তবে update_option('my_admin_errors', false);যদি বিবৃতিটি শেষে দেওয়া থাকে তবে এটি চালানো কি আরও কার্যকর হবে wpse_5102_admin_notice_handler()?
অ্যান্ড্রু ওড্রি

উত্তর:


6

আপনার শ্রেণিতে বা বৈশ্বিক হিসাবে ত্রুটিগুলি সম্ভবত একটি ক্ষণস্থায়ী বা মেটাতে সঞ্চয় করুন এবং পোস্টের অনুরোধগুলিতে এডমিন নোটিশগুলিতে তাদের প্রদর্শন করুন। ডাব্লুপি কোনও ফ্ল্যাশ বার্তা হ্যান্ডলার বৈশিষ্ট্যযুক্ত না।


আমাকে এই দিকে নির্দেশ করার জন্য ধন্যবাদ! আমি ত্রুটিগুলি সঞ্চয় করতে একটি মেটা ব্যবহার করে শেষ করেছি, কারণ আমার কাছে এটি বিশ্বব্যাপী বা সম্পত্তি হিসাবে করার চেষ্টা করার সমস্যা ছিল। আমি কীভাবে এটি করছি তা ব্যাখ্যা করার জন্য আমি এখনই আমার উত্তর আপডেট করছি ... দয়া করে আমাকে জানান যে আপনি যে ধরণের জিনিস প্রস্তাব দিচ্ছেন এটি যদি হয় বা এর থেকে আরও ভাল উপায় না হয় যেটা আমি পাচ্ছি না।
ম্যাথসম্যাথ

হ্যাঁ, এই জাতীয় জিনিস। যদিও এটি দ্বিতীয় সত্ত্বেও একটি সেশন ভেরিয়েবলে সঞ্চয় করুন। এটি, একই সাথে একাধিক লেখক পোস্ট সম্পাদনা করতে সক্ষম করতে। :-) এছাড়াও, আমি বিশ্বাস করি কোনও বিকল্পে মিথ্যা সংরক্ষণ করা সম্ভব নয়। পরিবর্তে একটি খালি স্ট্রিং সংরক্ষণ করুন।
ডেনিস ডি বার্নার্ডি

6

আমি সেশনগুলি ব্যবহার করার পরামর্শ দিচ্ছি যেহেতু এটি যখন দু'জন ব্যবহারকারী একই সময়ে সম্পাদনা করে তখন অদ্ভুত প্রভাব তৈরি করে না। সুতরাং আমি এই কি:

ওয়ার্ডপ্রেস দ্বারা সেশনগুলি শুরু হয় না। সুতরাং আপনার প্লাগইন, ফাংশন.এফপি বা এমনকি ডাব্লুপি-কনফিগারেশন.এফপিতে একটি সেশন শুরু করতে হবে :

if (!session_id())
  session_start();

পোস্টটি সংরক্ষণ করার সময়, তদন্তে ত্রুটি এবং বিজ্ঞপ্তিগুলি যুক্ত করুন:

function my_save_post($post_id, $post) {
   if($something_went_wrong) {
     //Append error notice if something went wrong
     $_SESSION['my_admin_notices'] .= '<div class="error"><p>This or that went wrong</p></div>';
     return false; //might stop processing here
   }
   if($somthing_to_notice) {  //i.e. successful saving
     //Append notice if something went wrong
     $_SESSION['my_admin_notices'] .= '<div class="updated"><p>Post updated</p></div>';
   }

   return true;
} 
add_action('save_post','my_save_post');

বিজ্ঞপ্তি এবং ত্রুটিগুলি মুদ্রণ করুন এবং তারপরে সেশনে বার্তাগুলি পরিষ্কার করুন:

function my_admin_notices(){
  if(!empty($_SESSION['my_admin_notices'])) print  $_SESSION['my_admin_notices'];
  unset ($_SESSION['my_admin_notices']);
}
add_action( 'admin_notices', 'my_admin_notices' );

সেশন সংস্করণের জন্য ঠিক করুন: সেশন ভেরিয়েবলটি ব্যবহারের প্রথম সময়ে ব্যবহার করবেন না = কেবল = আপনি যদি ডিবাগিং চালু করেন তবে আপনি কেন তা পরীক্ষা করতে পারবেন ...

3
আমি এটিও করছি, তবে আপনি যদি এর মতো বিস্তৃত দর্শকদের কাছে একটি প্লাগইন প্রকাশ করেন তবে লোকেদের এর জন্য আপনাকে ঘৃণা করবে। ওয়ার্ডপ্রেস সেশনগুলি ইনস্ট্যান্ট করে না কারণ এটি স্টেটলেস হতে এবং তাদের প্রয়োজন না হওয়ার জন্য ডিজাইন করা হয়েছে এবং কিছু অদ্ভুত সার্ভার সেটআপ এটি ভেঙে দেবে। সেশনগুলির পরিবর্তে ট্রান্সিয়েন্টস এপিআই - কোডেক্স.ওয়ার্ডপ্রেস.আর / ট্রান্সিয়েন্ট_এপিআই ব্যবহার করুন এবং আপনি সামঞ্জস্য বজায় রাখবেন। এখানে ভেবেছি এটি এখানে না করার কারণ হিসাবে এটি পতাকাঙ্কিত করার পক্ষে মূল্যবান।
pospi

@ স্পপিতে এটি get_option এবং update_option ফাংশনগুলির আসল ব্যবহার হিসাবে একই সমস্যা রয়েছে বলে মনে হয়। সুতরাং আমি অনুমান করি যে সমাধানটি বর্তমান ব্যবহারকারীর আইডিটি কীতে যুক্ত করা হবে?
গাজিলিয়ন

হ্যাঁ পুরোপুরি কাজ হবে! যতক্ষণ আপনি ব্যবহারকারীকে অনন্যভাবে চিহ্নিত করতে কিছু যুক্ত করেন আপনি লগইন হওয়া ব্যবহারকারীদের মধ্যে বার্তাগুলি মিশ্রিত করা এড়াতে পারবেন (:
pospi

5

উপর ভিত্তি করে pospi এর প্রস্তাবনা ব্যবহার transients , আমি নিম্নলিখিত নিয়ে এসেছেন। একমাত্র সমস্যাটি হ'ল h2অন্য বার্তাগুলি যেখানে যায় সেখানে নীচে বার্তাটি রাখার কোনও হুক নেই , তাই আমি এটি পেতে সেখানে একটি জিকুয়েরি হ্যাক করতে হয়েছিল।

প্রথমে আপনার save_post(বা অনুরূপ) হ্যান্ডলারের ক্ষেত্রে ত্রুটি বার্তাটি সংরক্ষণ করুন । আমি এটিকে 60 সেকেন্ডের একটি স্বল্পকালীন জীবনকাল দেই, তাই পুনঃনির্দেশটি ঘটানোর পক্ষে এটি যথেষ্ট দীর্ঘ।

if($has_error)
{
  set_transient( "acme_plugin_error_msg_$post_id", $error_msg, 60 );
}

তারপরে, পরবর্তী পৃষ্ঠায় লোড করে এটিকে প্রদর্শন করুন error আমি এটিও মুছে ফেলছি যাতে এটি দু'বার প্রদর্শিত না হয়।

add_action('admin_notices', 'acme_plugin_show_messages');

function acme_plugin_show_messages()
{
  global $post;
  if ( false !== ( $msg = get_transient( "acme_plugin_error_msg_{$post->ID}" ) ) && $msg) {
    delete_transient( "acme_plugin_error_msg_{$post->ID}" );
    echo "<div id=\"acme-plugin-message\" class=\"error below-h2\"><p>$msg</p></div>";
  }
}

যেহেতু admin_noticesপ্রাথমিক পৃষ্ঠার সামগ্রী তৈরি হওয়ার আগে আগুন জ্বলেছে, নোটিশটি অন্য পোস্ট সম্পাদনা বার্তাগুলি যেখানে যায় সেদিকে লক্ষ্য করা যায় না, তাই আমাকে এই জিকুয়ারিটি সেখানে স্থানান্তর করতে ব্যবহার করতে হয়েছিল:

jQuery('h2').after(jQuery('#acme-plugin-message'));

যেহেতু পোস্ট আইডিটি ক্ষণস্থায়ী নামের অংশ, তাই একাধিক ব্যবহারকারী একই পোস্ট একই সময়ে সম্পাদনা করা ব্যতীত বেশিরভাগ মাল্টি-ব্যবহারকারী পরিবেশে কাজ করা উচিত।


আপনি কি "পোস্ট আইডিটি ক্ষণস্থায়ী অংশের অংশ" বলে বিশদ বর্ণনা করতে পারেন? আমি এই কৌশলটি ব্যবহার করে ত্রুটি বার্তাগুলি পরিচালনা করার জন্য একটি শ্রেণি তৈরি করেছি তবে আমার ইউজার_আইডি পাস করার জন্য আমার কনস্ট্রাক্টর প্রয়োজন। কীটি হ্যাশ করার সময় অস্থায়ী এপিআই ব্যবহারকারী_আইডি ব্যবহার করে? (আমি জিজ্ঞাসা করেছি কারণ কোডেক্স এটির উল্লেখ করেছে বলে মনে হচ্ছে না)
গাজিলিয়ন

না, তবে আপনি এটি ম্যানুয়ালি যোগ করতে পারেন। কোড আমি উপরের পোস্ট ইন, অস্থায়ী নাম acme_plugin_error_msg_POSTID। আপনি ঠিক সেই মত ব্যবহারকারীর আইডি যুক্ত করতে পারেন acme_plugin_error_msg_POSTID_USERID
জোশুয়া কোডি

2

যখন save_postরান হয়, এটি ইতিমধ্যে ডেটাবেজে পোস্ট সংরক্ষণ করেছে।

ওয়ার্ডপ্রেস কোর কোডটি সন্ধান করুন, আরও বিশেষত wp-includes/post.phpএর update_post()কার্যক্রমে, কোনও অনুরোধ এটি ডাটাবেসে সংরক্ষণ করার আগে বাধা দেওয়ার কোনও অন্তর্নির্মিত উপায় নেই।

যাইহোক, আমরা হুক করতে পারেন pre_post_updateএবং ব্যবহার header()এবং get_post_edit_link()সংরক্ষিত হচ্ছে থেকে পোস্ট প্রতিরোধ।

<?php

/**
*   Performs validation before saving/inserting custom post type
*/
function custom_post_site_save($post_id, $post_data) {
    // If this is just a revision, don't do anything.
    if (wp_is_post_revision($post_id))
        return;

    if ($post_data['post_type'] == 'my_custom_post_type') {
        // Deny post titles with less than 5 characters
        if (strlen($post_data['post_title'] < 5)) {
            header('Location: '.get_edit_post_link($post_id, 'redirect'));
            exit;
        }
    }
}
add_action( 'pre_post_update', 'custom_post_site_save', 10, 2);

আপনি যদি ব্যবহারকারীকে কী ভুল হয়েছে সে সম্পর্কে অবহিত করতে তবে এই টুকরোটিটি দেখুন: https://gist.github.com/Luc45/09f2f9d0c0e574c0285051b288a0f935


এটির জন্য আপনাকে ধন্যবাদ, পুরোপুরি বৈধতা হ্যান্ডেল করে, প্রথমবার প্রকাশ করা হোক বা পোস্টটি আপডেট করা হোক। আপনি কেবল আমাকে সময় এবং প্রচেষ্টার একটি দুর্দান্ত কাজ বাঁচিয়েছেন।
জেড

1

কিছু জাভাস্ক্রিপ্টের সাহায্যে আপনি কেন আপনার ক্ষেত্রটি বৈধ করবেন না? আমি মনে করি এটিই এর পক্ষে সেরা পন্থা।


পরামর্শের জন্য ধন্যবাদ! আমি প্রশ্নটি যা ছেড়ে দিয়েছি (সরলতার জন্য) তা হচ্ছে আমি ফাইল আপলোড ত্রুটিগুলি হ্যান্ডেল করার চেষ্টা করছি, সুতরাং এটির সার্ভার-সাইড হওয়া দরকার। যদিও পরামর্শ জন্য ধন্যবাদ!
ম্যাথসম্যাট

জাভাস্ক্রিপ্ট যাচাইকরণ কিছু আক্রমণ থেকে বাধা দেয় না, সার্ভার-সাইড বৈধতা একমাত্র সুরক্ষিত। তদ্ব্যতীত, ওয়ার্ডপ্রেস ব্যবহারকারীর ডেটা যাচাই করার জন্য কিছু ভাল সরঞ্জাম সরবরাহ করে। তবে আপনি ঠিক বলেছেন যদি এটি সার্ভারে ডেটা প্রেরণের আগে কিছু মানগুলি পরীক্ষা করে, আপনি নিম্ন সার্ভারে কিছুটা সময় বাঁচাতে পারেন ^^
nderambure

1

উপরের স্ক্রিপ্টটি ব্যবহার করার চেষ্টা করে আমি এক অদ্ভুত সমস্যার মধ্যে পড়ে গেলাম। পোস্ট আপডেটের পরে সম্পাদনা স্ক্রিনে দুটি বার্তা প্রদর্শিত হয়। একজন পূর্ববর্তী সংরক্ষণ থেকে সামগ্রীটির স্থিতি প্রদর্শন করছে এবং অপরটি বর্তমানের থেকে দেখায়। উদাহরণস্বরূপ, যদি আমি পোস্টটি সঠিকভাবে সংরক্ষণ করি এবং তারপরে একটি ত্রুটি করি তবে প্রথমটি হ'ল "ত্রুটি" এবং দ্বিতীয়টি হ'ল "ঠিক আছে" - এগুলি একই সময়ে উত্পন্ন হয়। আমি যদি স্ক্রিপ্টটি পরিবর্তন করি এবং কেবল একটি বার্তা যুক্ত করি (উদাহরণস্বরূপ "ত্রুটি"), "ত্রুটি" দিয়ে একটি আপডেট শুরু করুন এবং তার পরে "ওকে", "ত্রুটি" বার্তাটি স্থির থাকে (দ্বিতীয়বার প্রদর্শিত হয়)। এ থেকে মুক্তি পাওয়ার জন্য আমাকে আবারও "ওকে" দিয়ে সঞ্চয় করতে হবে। আমি আসলে কী জানি না, আমি এটি তিনটি পৃথক স্থানীয় সার্ভারে পরীক্ষা করেছি এবং তাদের প্রত্যেকের ক্ষেত্রে একই সমস্যা রয়েছে।


আমি স্ক্রিপ্টের সহজ, দ্বিতীয় সংস্করণের আরও কয়েকটি পরীক্ষা করেছি যা আমি উপরে উল্লেখ করেছি এবং মনে হচ্ছে যদি "ত্রুটি" বার্তাটি সেশন অ্যারেটিতে সত্যিই সংযুক্ত করা থাকে তবে এটি সম্পাদনা স্ক্রিনে প্রদর্শিত হয়। যদি কোনও বার্তা না থাকে (সবকিছু "ঠিক আছে") এবং পূর্ববর্তী বার্তাটি ত্রুটিযুক্ত ছিল, এটি স্ক্রিনে উপস্থিত হবে। কী আশ্চর্যের বিষয়, এটি সংরক্ষণের সময় উত্পন্ন হয় (ক্যাশে করা হয় না) - আমি ত্রুটি বার্তা শরীরে তারিখ () ব্যবহার করে এটি পরীক্ষা করেছি। আমি এখন সম্পূর্ণ বিভ্রান্ত।
jlub

ঠিক আছে, অন্য কেউ যদি তার মাথা থেকে চুল টানছে - তবে দেখা গেল যে ওয়ার্ডপ্রেস রিভিশন সিস্টেমটি সমস্যা ছিল (সম্ভবত কোনও ধরণের বাগ সম্ভবত?)। আমি এটিকে অক্ষম করেছি এবং এখন সবকিছু ঠিক আছে।

0

আমি এমন একটি প্লাগইন লিখেছি যা পোস্ট সম্পাদনা পর্দার জন্য ফ্ল্যাশ ত্রুটি হ্যান্ডলিংয়ে যুক্ত করে এবং প্রয়োজনীয় ক্ষেত্রগুলি পূরণ না করা পর্যন্ত পোস্ট প্রকাশ করা বাধা দেয়:

https://github.com/interconnectit/required-fields

এটি আপনাকে যে কোনও পোস্ট ফিল্ড বাধ্যতামূলক করতে দেয় তবে আপনি যে এপিআই সরবরাহ করে তা কোনও কাস্টমাইজযোগ্য ত্রুটি বার্তা এবং বৈধকরণ ফাংশন সহ প্রয়োজনীয় কোনও কাস্টম ক্ষেত্র তৈরি করতে ব্যবহার করতে পারেন। ক্ষেত্রটি খালি আছে কিনা তা যাচাই করা ডিফল্ট।


আপনি যদি এগুলি জুড়ে আসেন তবে গিথুবটিতে কোনও সমস্যা যুক্ত করতে দ্বিধা করবেন না। আপনার ব্যবহার করতে পারেন এমন কিছু অ্যাডিশিয়াল ফিল্টার রয়েছে বলে আমার আরও কিছুটা API ডকুমেন্ট করা দরকার।
সানচোথফাত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.