কোনও মেটা ডেটা ক্ষেত্রটি বৈধ না হলে কাস্টম পোস্ট টাইপ পোস্ট প্রকাশ করবেন না


12

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

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

অনেক ধন্যবাদ, দশা


এই প্রশ্নটি আপনাকে স্মরণ করিয়ে দেওয়ার জন্য কোমল নুডের এখনও একটি স্বীকৃত উত্তর দরকার ..;) যদি উত্তর না হয় তবে আপনার প্রশ্নের উত্তর দেওয়া হয়নি দয়া করে কীভাবে সম্বোধন করা হয়নি সে সম্পর্কে অতিরিক্ত মন্তব্য সহ আপনার প্রশ্নটি আপডেট করার বিষয়টি বিবেচনা করুন (বা যেখানে প্রযোজ্য ক্ষেত্রে আপনাকে সাহায্যের প্রয়োজন হতে পারে)।
t31os

উত্তর:


14

আপনি মাইনর জিকুয়ের হ্যাকের সাথে সমস্ত একসাথে সংরক্ষণ করা পোস্টটি আটকাতে পারেন এবং এজ্যাক্সের সাথে ক্লায়েন্টের পাশে বা সার্ভারের দিকে সঞ্চয় করার আগে ক্ষেত্রগুলিকে বৈধতা দিতে পারেন:

প্রথমে আমরা আমাদের জাভাস্ক্রিপ্টটি ইভেন্টটি জমা / প্রকাশ করার জন্য যুক্ত করি এবং আসল জমা দেওয়ার আগে এটি আমাদের নিজস্ব এজ্যাক্স ফাংশন জমা দিতে ব্যবহার করি:

 add_action('wp_print_scripts','my_publish_admin_hook');

function my_publish_admin_hook(){
if (is_admin()){
        ?>
        <script language="javascript" type="text/javascript">
            jQuery(document).ready(function() {
                jQuery('#post').submit(function() {

                    var form_data = jQuery('#post').serializeArray();
                    form_data = jQuery.param(form_data);
                    var data = {
                        action: 'my_pre_submit_validation',
                        security: '<?php echo wp_create_nonce( 'pre_publish_validation' ); ?>',
                        form_data: form_data
                    };
                    jQuery.post(ajaxurl, data, function(response) {
                        if (response.indexOf('True') > -1 || response.indexOf('true') > -1 || response === true ||  response) {
                            jQuery('#ajax-loading').hide();
                            jQuery('#publish').removeClass('button-primary-disabled');
                            return true;
                        }else{
                            alert("please correct the following errors: " + response);
                            jQuery('#ajax-loading').hide();
                            jQuery('#publish').removeClass('button-primary-disabled');
                            return false;
                        }
                    });
                    return false;
                });
            });
        </script>
        <?php
    }
}

তারপরে আমরা আসল বৈধকরণটি করতে ফাংশনটি তৈরি করি:

add_action('wp_ajax_my_pre_submit_validation', 'pre_submit_validation');
function pre_submit_validation(){
    //simple Security check
    check_ajax_referer( 'pre_publish_validation', 'security' );

    //do your validation here
    //all of the form fields are in $_POST['form_data'] array
    //and return true to submit: echo 'true'; die();
    //or your error message: echo 'bal bla bla'; die();
}

আপনি আপনার পোষ্ট টাইপের জন্য শর্তযুক্ত চেক যোগ করে কেবলমাত্র আপনার পোস্ট টাইপের জন্য বৈধতা দেওয়ার জন্য এটি সর্বদা কিছুটা পরিবর্তন করতে পারেন my_publish_admin_hookএবং ক্লায়েন্টের পক্ষে যাচাই করতে পারেন তবে আমি সার্ভারের দিকে পছন্দ করি।


এটি করার জন্য কোনও সার্ভার-পাশের উপায় নেই?
জেফ

1
এটি করার জন্য এটি কোনও সার্ভারের পাশ।
বাইনারনেট

1
আমি কিছু ভুল বুঝতে পারি। দেখে মনে হচ্ছে আপনি জাভাস্ক্রিপ্ট রেন্ডার করতে কেবল পিএইচপি ব্যবহার করছেন যা যাচাইকরণ করে। এটি সার্ভারের পক্ষে বৈধতা নয়। কীভাবে pre_submit_validationফিট হয় আমি সত্যিই বুঝতে পারছি না
জেফ

প্রথম my_publish_admin_hookব্লকটি ইন্টারসেপ্ট পোস্ট জমা দেওয়ার ক্লায়েন্ট-সাইড করে - তবে এটি পরে সার্ভারের কাছে একটি এজেএক্স কল করে (প্রি-অফিসার-জমা দেওয়া pre_submit_validation) যা সার্ভার-সাইড বৈধতা সম্পাদন করে।
Emc

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

7

পদ্ধতির দুটি পদক্ষেপ রয়েছে: প্রথমত, আপনার কাস্টম মেটাবক্স ক্ষেত্রের ডেটা সংরক্ষণ করার জন্য একটি ফাংশন (সেভ_পোস্টে আবদ্ধ) এবং দ্বিতীয়ত, নতুন পোস্ট_মেটা (যা আপনি সবেমাত্র সংরক্ষণ করেছেন) পড়ার জন্য একটি ফাংশন, এটি বৈধতা দিন, এবং ফলাফলটির পরিবর্তন করুন প্রয়োজনীয় হিসাবে সংরক্ষণ করা (সেভ_পোস্টেও জড়িত, তবে প্রথমটির পরে)। বৈধকরণকারীর কার্য, যদি বৈধতা ব্যর্থ হয় তবে পোস্ট পোস্টস্ট্যাটাসটিকে ডান "পিছিয়ে" থেকে পরিবর্তিত করে কার্যকরভাবে পোস্টটি প্রকাশ হতে বাধা দেয়।

যেহেতু সেভ_পোস্ট ফাংশনটি প্রচুর পরিমাণে ডাকা হয়, প্রতিটি ফাংশনটিতে কেবল তখন ব্যবহারকারী কার্যকর করতে হয় এবং কেবলমাত্র আপনার কাস্টম পোস্টের জন্য (মাইকাস্টম টাইপ) পরীক্ষা করতে হয়।

আমি সাধারণত কিছু কাস্টম বিজ্ঞপ্তি বার্তা যুক্ত করি যাতে ব্যবহারকারীদের তাদের পোস্ট কেন প্রকাশিত হয় তা জানতে সহায়তা করে তবে সেগুলি এখানে অন্তর্ভুক্ত করা কিছুটা জটিল হয়ে পড়ে ...

আমি এই সঠিক কোডটি পরীক্ষা করেছি না, তবে আমি বড় আকারের কাস্টম পোস্ট টাইপ সেটআপগুলিতে যা করেছি তার একটি সরল সংস্করণ।

add_action('save_post', 'save_my_fields', 10, 2);
add_action('save_post', 'completion_validator', 20, 2);

function save_my_fields($pid, $post) {
    // don't do on autosave or when new posts are first created
    if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_status == 'auto-draft' ) return $pid;
    // abort if not my custom type
    if ( $post->post_type != 'mycustomtype' ) return $pid;

    // save post_meta with contents of custom field
    update_post_meta($pid, 'mymetafield', $_POST['mymetafield']);
}


function completion_validator($pid, $post) {
    // don't do on autosave or when new posts are first created
    if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_status == 'auto-draft' ) return $pid;
    // abort if not my custom type
    if ( $post->post_type != 'mycustomtype' ) return $pid;

    // init completion marker (add more as needed)
    $meta_missing = false;

    // retrieve meta to be validated
    $mymeta = get_post_meta( $pid, 'mymetafield', true );
    // just checking it's not empty - you could do other tests...
    if ( empty( $mymeta ) ) {
        $meta_missing = true;
    }

    // on attempting to publish - check for completion and intervene if necessary
    if ( ( isset( $_POST['publish'] ) || isset( $_POST['save'] ) ) && $_POST['post_status'] == 'publish' ) {
        //  don't allow publishing while any of these are incomplete
        if ( $meta_missing ) {
            global $wpdb;
            $wpdb->update( $wpdb->posts, array( 'post_status' => 'pending' ), array( 'ID' => $pid ) );
            // filter the query URL to change the published message
            add_filter( 'redirect_post_location', create_function( '$location','return add_query_arg("message", "4", $location);' ) );
        }
    }
}

একাধিক মেটাবক্স ক্ষেত্রের জন্য, কেবলমাত্র আরও সমাপ্তি চিহ্নিতকারী যুক্ত করুন এবং আরও পোস্ট_মেটা পুনরুদ্ধার করুন এবং আরও পরীক্ষা করুন ..


1

আপনাকে এজেন্টে আপনার মেটা ক্ষেত্রের মানটি যাচাই করতে হবে / যাচাই করতে হবে অর্থাৎ যখন ব্যবহারকারী "প্রকাশ / আপডেট" বোতামটি চাপান। এখানে আমি খালি মূল্যের জন্য মেটা ক্ষেত্র "product_number" থাকা ওয়ার্ককমার্স পণ্যটি যাচাই করছি।

add_action('admin_head-post.php','ep_publish_admin_hook');
add_action('admin_head-post-new.php','ep_publish_admin_hook');

function ep_publish_admin_hook(){
    global $post;
    if ( is_admin() && $post->post_type == 'product' ){
        ?>
        <script language="javascript" type="text/javascript">
            (function($){
                jQuery(document).ready(function() {

                    jQuery('#publish').click(function() {
                        if(jQuery(this).data("valid")) {
                            return true;
                        }

                        //hide loading icon, return Publish button to normal
                        jQuery('#publishing-action .spinner').addClass('is-active');
                        jQuery('#publish').addClass('button-primary-disabled');
                        jQuery('#save-post').addClass('button-disabled');

                        var data = {
                            action: 'ep_pre_product_submit',
                            security: '<?php echo wp_create_nonce( "pre_publish_validation" ); ?>',
                            'product_number': jQuery('#acf-field-product_number').val()
                        };
                        jQuery.post(ajaxurl, data, function(response) {

                            jQuery('#publishing-action .spinner').removeClass('is-active');
                            if ( response.success ){
                                jQuery("#post").data("valid", true).submit();
                            } else {
                                alert("Error: " + response.data.message );
                                jQuery("#post").data( "valid", false );

                            }
                            //hide loading icon, return Publish button to normal
                            jQuery('#publish').removeClass('button-primary-disabled');
                            jQuery('#save-post').removeClass('button-disabled');
                        });
                        return false;
                    });
                });
            })(jQuery);
        </script>
        <?php
    }
}

এর পরে অ্যাজাক্স হ্যান্ডলার ফাংশন যুক্ত করুন,

add_action('wp_ajax_ep_pre_product_submit', 'ep_pre_product_submit_func');
function ep_pre_product_submit_func() {
    //simple Security check
    check_ajax_referer( 'pre_publish_validation', 'security' );

    if ( empty( $_POST['product_number'] ) || empty( $_POST['file_attachment'] ) ) {
         $data = array(
            'message' => __('Please enter part number and specification document.'),
        );
        wp_send_json_error( $data );
    }
    wp_send_json_success();
}

0

বেন্টারনেটের সমাধান ব্যবহার করে পোস্ট ভেরিয়েবলগুলি পড়তে কেবল এটি যুক্ত করতে চেয়েছিলেন, আপনাকে $_POST['form_data']পিএইচপি parse_strফাংশনটি ব্যবহার করে স্ট্রিংটি পার্স করতে হবে (কেবল আপনার কিছু গবেষণার সময় বাঁচাতে)।

$vars = parse_str( $_POST['form_data'] );

তারপরে আপনি প্রতিটি ভেরিয়েবল সবেমাত্র ব্যবহার করে অ্যাক্সেস করতে পারবেন $varname। উদাহরণস্বরূপ, যদি আপনার কাছে "আমার_মেটা" নামে একটি মেটা ক্ষেত্র থাকে তবে আপনি এটিতে এটি অ্যাক্সেস করতে পারবেন:

$vars = parse_str ( $_POST['form_data'] ) 
if ( $my_meta == "something" ) { // do something }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.